1957. Delete Characters to Make Fancy String

1957. Delete Characters to Make Fancy String#

easy, String

A fancy string is a string where no three consecutive characters are equal.

Given a string s, delete the minimum possible number of characters from s to make it fancy.

Return the final string after the deletion. It can be shown that the answer will always be unique.

Example 1:

Input: s = โ€œleeetcodeโ€
Output: โ€œleetcodeโ€
Explanation:
Remove an โ€˜eโ€™ from the first group of โ€˜eโ€™s to create โ€œleetcodeโ€.
No three consecutive characters are equal, so return โ€œleetcodeโ€.

Example 2:

Input: s = โ€œaaabaaaaโ€
Output: โ€œaabaaโ€
Explanation:
Remove an โ€˜aโ€™ from the first group of โ€˜aโ€™s to create โ€œaabaaaaโ€.
Remove two โ€˜aโ€™s from the second group of โ€˜aโ€™s to create โ€œaabaaโ€.
No three consecutive characters are equal, so return โ€œaabaaโ€.

Example 3:

Input: s = โ€œaabโ€
Output: โ€œaabโ€
Explanation: No three consecutive characters are equal, so return โ€œaabโ€.

## code

import os
import logging
import traceback
import datetime


def get_logger(LEVEL: str = "INFO") -> logging.Logger:
    # log_time = datetime.datetime.today().strftime("%Y-%m-%d_%H-%M-%S")

    logger = logging.getLogger("custom_logger")
    logger.setLevel(getattr(logging, LEVEL.upper(), logging.INFO))

    # file_handler = logging.FileHandler(f"./logs/{log_time}_logfile.log")
    stream_handler = logging.StreamHandler()

    formatter = logging.Formatter(
        fmt="[%(asctime)s %(levelname)s] %(message)s", datefmt="%Y/%m/%d %H:%M:%S"
    )
    # file_handler.setFormatter(formatter)
    stream_handler.setFormatter(formatter)

    if logger.hasHandlers():
        logger.handlers.clear()

    # logger.addHandler(file_handler)
    logger.addHandler(stream_handler)

    return logger


def sol(problem_num, func):
    script_dir = os.getcwd()  # os.path.dirname(os.path.abspath(__file__))
    path = script_dir + f"\\txt\\{problem_num}" + ".txt"
    # logger.info(f"file path : {path}")

    try:
        with open(path, "r") as getter:
            line_count = 1
            while True:
                line = getter.readline()
                # logger.info(f"this line : {line.strip().split()}")
                if not line:
                    logger.info("EOF")
                    break
                try:
                    inp, oup = line.strip().split()
                    if not func(inp):
                        raise ValueError(f"wrong output in line : {line}")
                    logger.info(f"{line_count} : {inp} : {oup == func(inp)}")
                    line_count += 1
                except Exception as e:
                    logger.error(f"Error occurred while processing line: {line}")
                    logger.error(f"Exception: {e}")
                    logger.error(traceback.format_exc())
                    line_count += 1
    except FileNotFoundError:
        logger.error(f"File not found: {path}")
    except Exception as e:
        logger.error(f"Error opening file: {e}")
        logger.error(traceback.format_exc())
    logger.info("ACCEPT")


class Solution:
    def makeFancyString(self, s: str) -> str:
        result = ""

        grouped = []
        current_group = s[0]
        for char in s[1:]:
            if char == current_group[-1]:
                current_group += char
            else:
                grouped.append(current_group)
                current_group = char
        grouped.append(current_group)

        for group in grouped:
            if len(group) > 2:
                result += group[0] * 2
            else:
                result += group

        return result


problem_num = 1957
global logger
logger = get_logger("info")
sol(problem_num, Solution().makeFancyString)
[2024/11/01 14:11:20 INFO] 1 : leeetcode : True
[2024/11/01 14:11:20 INFO] 2 : aaabaaaa : True
[2024/11/01 14:11:20 INFO] EOF
[2024/11/01 14:11:20 INFO] ACCEPT

๊ฒ๋‚˜ ๋‚˜๋Š” ๋ญ”๊ฐ€ ์–ด๋ ต๊ฒŒ ํ’€์—ˆ๋Š”๋ฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ์ฝ”๋“œ ๋ณด๋‹ˆ๊น ์–ด์ด๊ฐ€ ์—†์„ ์ •๋„๋กœ ์‰ฝ๊ฒŒ ํ‘ผ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

class Solution:
    def makeFancyString(self, s: str) -> str:
        ans = s[0]
        cnt = 1
        for i in range(1, len(s)):
            if s[i] == ans[-1]:
                cnt += 1
                if cnt < 3:
                    ans += s[i]
            else:
                cnt = 1
                ans += s[i]
        return ans

๋‚˜๋Š” for ๋ฌธ์„ ๋‘๋ฒˆ์„ ๋Œ์ง€๋งŒ ์—ฌ๊ธด ํ•œ๋ฒˆ๋งŒ ๋Œ๋ฉด์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ฒ„๋ฆฐ๋‹ค. ์ค‘์š”ํ•œ ๊ฑฐ์Šจ cnt += ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.