Tech for good

[Neetcode 150/Sliding Window] Longest Repeating Character Replacement ๋ณธ๋ฌธ

IT/Computer Science

[Neetcode 150/Sliding Window] Longest Repeating Character Replacement

Diana Kang 2025. 2. 26. 23:57

https://neetcode.io/problems/longest-repeating-substring-with-replacement

 

NeetCode

 

neetcode.io

๐Ÿ›  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  1. ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ left์™€ right ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋กœ ์œˆ๋„์šฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•œ๋‹ค.
  2. ์œˆ๋„์šฐ ๋‚ด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž๋ฅผ ์ฐพ๊ณ , ๋‚˜๋จธ์ง€ ๋ฌธ์ž๋“ค์„ k๋ฒˆ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  3. ์œˆ๋„์šฐ ํฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž ๊ฐœ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฌธ์ž๊ฐ€ k๋ณด๋‹ค ํฌ๋ฉด left ํฌ์ธํ„ฐ๋ฅผ ์ด๋™ํ•˜์—ฌ ์œˆ๋„์šฐ๋ฅผ ์ค„์ธ๋‹ค.
  4. ์ตœ๋Œ€ ์œˆ๋„์šฐ ํฌ๊ธฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋ฉด์„œ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.
class Solution:
    def characterReplacement(self, s: str, k: int) -> int:
        left = 0
        max_count = 0  # ํ˜„์žฌ ์œˆ๋„์šฐ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž ๊ฐœ์ˆ˜
        max_length = 0
        char_count = Counter()  # ์œˆ๋„์šฐ ๋‚ด ๋ฌธ์ž ๊ฐœ์ˆ˜ ์ €์žฅ

        for right in range(len(s)):
            char_count[s[right]] += 1
            max_count = max(max_count, char_count[s[right]])

            # (์œˆ๋„์šฐ ํฌ๊ธฐ - ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž ๊ฐœ์ˆ˜) > k ์ด๋ฉด left ์ด๋™
            if (right - left + 1) - max_count > k:
                char_count[s[left]] -= 1
                left += 1  # ์œˆ๋„์šฐ ํฌ๊ธฐ ์ค„์ด๊ธฐ

            # ์ตœ๋Œ€ ๊ธธ์ด ๊ฐฑ์‹ 
            max_length = max(max_length, right - left + 1)

        return max_length

๐Ÿ’ก ์ฝ”๋“œ ์„ค๋ช…

  1. char_count๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์œˆ๋„์šฐ ๋‚ด ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
  2. max_count๋Š” ์œˆ๋„์šฐ ๋‚ด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž ๊ฐœ์ˆ˜๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
  3. (์œˆ๋„์šฐ ํฌ๊ธฐ - max_count) > k ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด left ํฌ์ธํ„ฐ๋ฅผ ์ด๋™์‹œ์ผœ ์œˆ๋„์šฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•œ๋‹ค.
    • Case 1
      • s =(AAABA)AAAA
      • s = (AAAAAA)AAA -> ์ด๋Ÿฐ ๊ฒฝ์šฐ์— right ํฌ์ธํ„ฐ๋ฅผ ๊ณ„์† ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
      • s = (AAAAAAAA)A -> ์ด๋Ÿฐ ๊ฒฝ์šฐ์— right ํฌ์ธํ„ฐ๋ฅผ ๊ณ„์† ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
      • ...
    • Case 2
      • s = AAABABCAA
      • s = (AAABA)BCAA k = 1 -> 0 (์ด์ œ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž ๊ฐœ์ˆ˜๊ฐ€ 0๊ฐœ ๋‚จ์•˜๋‹ค๋Š” ๋œป)
      • s =(AAAAAB)CAA 
      • s = (AAAAAB)CAA -> ๋” ์ด์ƒ ์—ฐ์†๋œ ๋ฌธ์ž์—ด ๋งŒ๋“œ๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅ. ๋”ฐ๋ผ์„œ left ํฌ์ธํ„ฐ๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
      • s = A(AAAAB)CAA -> k = 1 -> 0
      • s = A(AAAAA)CAA
      • s = A(AAAAAC)AA -> k = 0. C๋ฅผ A๋กœ ๋ฐ”๊พธ๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅ. ๋”ฐ๋ผ์„œ left ํฌ์ธํ„ฐ๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
      • s = AA(AAAB)CAA
  4. ์ตœ๋Œ“๊ฐ’์„ max_length์— ์ €์žฅํ•˜๋ฉด์„œ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ•œ๋‹ค.

๐Ÿ“Œ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

  • ๊ฐ ๋ฌธ์ž๋Š” ์ตœ๋Œ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ left์™€ right์— ์˜ํ•ด ์ด๋™
    โ†’ O(N)
  • Counter ์‚ฌ์šฉ์€ O(1) ์—ฐ์‚ฐ์ด๋ฏ€๋กœ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ.