onlybooks / python-algorithm-interview

<파이썬 알고리즘 인터뷰> 95가지 알고리즘 문제 풀이로 완성하는 코딩 테스트
1.21k stars 325 forks source link

p. 581: `77. 가장 긴 반복 문자 대체` - 좀 더 가독성이 높은 코드 질문 #159

Closed nayeonshin closed 2 years ago

nayeonshin commented 2 years ago

안녕하세요,

581쪽 77번 문제 (가장 긴 반복 문자 대체)풀이에는 collections.Counter()most_common() 메소드를 사용하면서 숫자를 나열하는 것 때문에 코드의 가독성이 떨어지게 되었다고 나와있습니다.

이 책의 풀이를 보면 Counter() 사용 목적이 단순히 매개변수 s에 존재하는 캐릭터를 하나씩 세는 것 같아서, Counter() 대신 collections.defaultdict()max()로 최대 value를 가져오는 것이 좋은 대체 방법일 지에 대해 저자 님의 의견을 듣고 싶습니다.

아래는 defaultdict()를 사용한 제 풀이인데 한번 봐주실 수 있을까요?

def character_replacement(s: str, k: int) -> int:
    """
    Time complexity: O(n) where n is len(s)
    Space complexity: O(1) as `s` consists of only uppercase English letters
    """
    chars_to_counts = defaultdict(int)
    left = 0

    # enumerate()으로 1부터 시작하면서 off-by-one 에러 방지
    for right, right_char in enumerate(s, 1):
        chars_to_counts[right_char] += 1

        # 윈도우 내 가장 많이 등장하는 문자의 빈도 수
        # len(chars_to_counts) <= 26이므로 시간 복잡도 O(1)
        max_count = max(chars_to_counts.values())

        if ((right - left) - max_count) > k:
            left_char = s[left]
            chars_to_counts[left_char] -= 1
            left += 1

    return right - left

읽어주셔서 감사합니다!


추가: 이 책으로 공부하면서 이번에 아마존이랑 세일즈포스 소프트웨어 엔지니어 인턴 자리에 붙게 되었습니다! 좋은 책 집필해 주셔서 정말 감사합니다. 😀

likejazz commented 2 years ago

@nayeonshin 안녕하세요. 네 맞습니다. 책의 풀이에서 Counter()는 단순히 most_common()을 위해 사용했기 때문에 언급하신대로 defaultdict()max()만으로 충분히 대체 가능합니다. 제안해주신 defaultdict()가 좀 더 좋은 풀이 같네요! 이외에 사소한 부분이지만 아래처럼 if문에서 괄호는 제외해도 될거 같아요.

if right - left - max_count > k:
    left_char = s[left]
    ...

그리고 인턴 합격하신거 정말 축하드려요!