|
| 1 | +from collections import defaultdict |
| 2 | + |
| 3 | + |
| 4 | +# 7๊ธฐ ํ์ด |
| 5 | +# ์๊ฐ ๋ณต์ก๋: O(n) |
| 6 | +# - right๋ ๋งค ๋ฃจํ๋ง๋ค ์ ์งํ๊ณ left๋ ์ต๋ n๋ฒ ์ ์งํ๋ฏ๋ก ํฉ์ณ์ O(n) |
| 7 | +# ๊ณต๊ฐ ๋ณต์ก๋: O(1) |
| 8 | +# - s์ ์๋ ๋ฌธ์๋ค์ ๊ฐ์๋งํผ ๊ณต๊ฐ ๋ณต์ก๋๊ฐ ๋์ด๋๊ฒ ์ง๋ง ๋ชจ๋ ๋๋ฌธ์์ธ ์ํ๋ฒณ๋ง์ด key๋ก ๋ค์ด์ค๋ฏ๋ก ์ต๋ 26๊ฐ |
| 9 | +class Solution: |
| 10 | + # ๊ธฐ๋ณธ ์์ด๋์ด: ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์ฌ์ฉํ๋ฉด์ |
| 11 | + # ์๋์ฐ ๋ด์ ๊ฐ์ฅ ๋ง์ด ์๋ ๋ฌธ์์ ๊ฐ์์ k๊ฐ์ ๋ํ ๊ฐ์ด ์๋์ฐ๋ฅผ ์ด๊ณผํ๋์ง ์๋์ง๋ฅผ ํ์ธ |
| 12 | + def characterReplacement(self, s: str, k: int) -> int: |
| 13 | + left = 0 # ์๋์ฐ ์ผ์ชฝ ์ธ๋ฑ์ค ๊ฐ |
| 14 | + max_len = 0 # ๋ฌธ์ ์ ๋ต(๋ณ๊ฒฝ ์ ๊ฐ์ฅ ๊ธด substring ๊ธธ์ด) |
| 15 | + char_dict = defaultdict(int) # ์๋์ฐ ๋ด์ ๊ฐ ๋ฌธ์๋ค ๊ฐ์๋ฅผ ํ์ธํ๊ธฐ ์ํ dict |
| 16 | + max_char_cnt = 0 # ์๋์ฐ ๋ด์ ๊ฐ์ฅ ๋ง์ ๋ฌธ์์ ๊ฐ์ ๊ทธ ์์ฒด(dict์ value() ๋ฉ์๋๋ฅผ ๋งค๋ฒ ํธ์ถํ์ง ์๊ฒ ํ๊ธฐ ์ํจ) |
| 17 | + |
| 18 | + for right in range(len(s)): # ์๋์ฐ ์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค ๊ฐ |
| 19 | + char_dict[s[right]] += 1 # ์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค์ ํด๋นํ๋ ๋ฌธ์(์: A)์ ๋ํ ๊ฐ์๋ฅผ ํ๋ ์ฌ๋ฆผ |
| 20 | + max_char_cnt = max(max_char_cnt, char_dict[s[right]]) # ํ์ฌ ์๋์ฐ์์ ๊ฐ์ฅ ๋ง์ ๋ฌธ์์ ๊ฐ์๋ฅผ ์
๋ฐ์ดํธ |
| 21 | + |
| 22 | + if max_char_cnt + k >= right - left + 1: |
| 23 | + # ๊ฐ์ฅ ๋ง์ ๋ฌธ์์ด ์ฌ์ด์ ์๋ ๋ค๋ฅธ ๋ฌธ์๋ค์ ๊ฐ์๊ฐ k๋ณด๋ค ์์ผ๋ฉด ๋ณ๊ฒฝ ๊ฐ๋ฅ |
| 24 | + # -> ์๋์ฐ ๋ด์์ ๊ฐ์ฅ ๊ธด repeating substring์ ๋ง๋ค ์ ์์ |
| 25 | + max_len = max(max_len, right - left + 1) |
| 26 | + else: |
| 27 | + # ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด left์ ๋ฌธ์๋ฅผ char_dict๋ก๋ถํฐ ํ๋ ์ค์ด๊ณ |
| 28 | + # left๋ฅผ ํ๋ ์ฎ๊ธด๋ค(์๋ก์ด ์๋์ฐ๋ฅผ ๋ง๋ ๋ค๋ ์๋ฏธ) |
| 29 | + char_dict[s[left]] -= 1 |
| 30 | + left += 1 |
| 31 | + |
| 32 | + return max_len |
0 commit comments