Skip to content

Commit 94dfa2e

Browse files
Create taurus09318976.py
1 parent 79e583b commit 94dfa2e

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
'''
2+
문제의 μ˜λ„
3+
이 λ¬Έμ œλŠ” λ¬Έμžμ—΄μ—μ„œ μ΅œλŒ€ k번의 문자 변경을 톡해 같은 문자둜만 이루어진 κ°€μž₯ κΈ΄ λΆ€λΆ„ λ¬Έμžμ—΄μ„ μ°ΎλŠ” λ¬Έμ œμž„.
4+
5+
핡심 포인트:
6+
μ΅œλŒ€ kλ²ˆκΉŒμ§€ 문자λ₯Ό λ‹€λ₯Έ 문자둜 λ°”κΏ€ 수 있음
7+
λ°”κΎΌ ν›„ 같은 문자둜만 이루어진 λΆ€λΆ„ λ¬Έμžμ—΄μ˜ μ΅œλŒ€ 길이λ₯Ό ꡬ해야 함
8+
μ—°μ†λœ λΆ€λΆ„ λ¬Έμžμ—΄μ΄μ–΄μ•Ό 함
9+
10+
ν•΄κ²° 방법
11+
μŠ¬λΌμ΄λ”© μœˆλ„μš°(Sliding Window) + ν•΄μ‹œλ§΅ 기법을 μ‚¬μš©ν•¨:
12+
μœˆλ„μš° λ‚΄μ—μ„œ κ°€μž₯ λΉˆλ„κ°€ 높은 문자λ₯Ό μ°ΎκΈ°
13+
λ‚˜λ¨Έμ§€ λ¬Έμžλ“€μ„ κ°€μž₯ λΉˆλ„κ°€ 높은 문자둜 λ°”κΎΈλŠ” 데 ν•„μš”ν•œ λ³€κ²½ 횟수 계산
14+
λ³€κ²½ νšŸμˆ˜κ°€ kλ₯Ό μ΄ˆκ³Όν•˜λ©΄ μœˆλ„μš° μΆ•μ†Œ
15+
16+
μ‹€ν–‰ κ³Όμ •:
17+
μœˆλ„μš° "A": max_freq=1, λ³€κ²½ ν•„μš”=0 ≀ k=1
18+
μœˆλ„μš° "AA": max_freq=2, λ³€κ²½ ν•„μš”=0 ≀ k=1
19+
μœˆλ„μš° "AAB": max_freq=2, λ³€κ²½ ν•„μš”=1 ≀ k=1
20+
μœˆλ„μš° "AABA": max_freq=3, λ³€κ²½ ν•„μš”=1 ≀ k=1
21+
μœˆλ„μš° "AABAB": max_freq=3, λ³€κ²½ ν•„μš”=2 > k=1
22+
μœˆλ„μš° μΆ•μ†Œ: "ABAB" β†’ max_freq=2, λ³€κ²½ ν•„μš”=2 > k=1
23+
계속 μΆ•μ†Œ: "BAB" β†’ max_freq=2, λ³€κ²½ ν•„μš”=1 ≀ k=1
24+
Output: 4 (μœˆλ„μš° "AABA"μ—μ„œ B ν•˜λ‚˜λ₯Ό A둜 λ°”κΎΈλ©΄ "AAAA")
25+
26+
핡심 아이디어:
27+
μœˆλ„μš° λ‚΄μ—μ„œ κ°€μž₯ λ§Žμ€ 문자λ₯Ό κΈ°μ€€μœΌλ‘œ ν•˜κ³ ,
28+
λ‚˜λ¨Έμ§€ λ¬Έμžλ“€μ„ κ·Έ 문자둜 λ°”κΎΈλŠ” 데 ν•„μš”ν•œ λ³€κ²½ νšŸμˆ˜κ°€ k μ΄ν•˜μΈμ§€ 확인.
29+
30+
μ‹œκ°„ λ³΅μž‘λ„: O(n)
31+
각 λ¬Έμžκ°€ μ΅œλŒ€ 2번 방문됨 (right ν¬μΈν„°λ‘œ 1번, left ν¬μΈν„°λ‘œ 1번)
32+
ν•΄μ‹œλ§΅ 연산은 O(1)μ΄λ―€λ‘œ μ „μ²΄μ μœΌλ‘œ μ„ ν˜• μ‹œκ°„
33+
34+
곡간 λ³΅μž‘λ„: O(1)
35+
μ˜μ–΄ λŒ€λ¬Έμžλ§Œ μ‚¬μš©ν•˜λ―€λ‘œ ν•΄μ‹œλ§΅ ν¬κΈ°λŠ” μ΅œλŒ€ 26개둜 μƒμˆ˜
36+
기타 λ³€μˆ˜λ“€λ„ μƒμˆ˜ 곡간
37+
'''
38+
39+
class Solution:
40+
def characterReplacement(self, s: str, k: int) -> int:
41+
# ν˜„μž¬ μœˆλ„μš° λ‚΄ 각 문자의 개수λ₯Ό μ €μž₯ν•˜λŠ” ν•΄μ‹œλ§΅
42+
char_count = {}
43+
44+
# μŠ¬λΌμ΄λ”© μœˆλ„μš°μ˜ μ‹œμž‘μ 
45+
left = 0
46+
47+
# μœˆλ„μš° λ‚΄μ—μ„œ κ°€μž₯ λΉˆλ„κ°€ 높은 문자의 개수
48+
max_freq = 0
49+
50+
# 결과둜 λ°˜ν™˜ν•  μ΅œλŒ€ 길이
51+
max_length = 0
52+
53+
# 였λ₯Έμͺ½ ν¬μΈν„°λ‘œ λ¬Έμžμ—΄μ„ μˆœνšŒν•˜λ©° μœˆλ„μš° ν™•μž₯
54+
for right in range(len(s)):
55+
# ν˜„μž¬ 문자λ₯Ό μœˆλ„μš°μ— μΆ”κ°€ν•˜κ³  λΉˆλ„ 증가
56+
char = s[right]
57+
char_count[char] = char_count.get(char, 0) + 1
58+
59+
# ν˜„μž¬ μœˆλ„μš°μ—μ„œ κ°€μž₯ λΉˆλ„κ°€ 높은 문자의 개수 μ—…λ°μ΄νŠΈ
60+
max_freq = max(max_freq, char_count[char])
61+
62+
# ν˜„μž¬ μœˆλ„μš° 크기
63+
window_size = right - left + 1
64+
65+
# λ³€κ²½ν•΄μ•Ό ν•  문자 개수 = 전체 μœˆλ„μš° 크기 - κ°€μž₯ λ§Žμ€ 문자 개수
66+
# 이 값이 k보닀 크면 μœˆλ„μš°κ°€ μœ νš¨ν•˜μ§€ μ•ŠμŒ
67+
if window_size - max_freq > k:
68+
# μ™Όμͺ½ 문자λ₯Ό μœˆλ„μš°μ—μ„œ μ œκ±°ν•˜κ³  μ™Όμͺ½ 포인터 이동
69+
left_char = s[left]
70+
char_count[left_char] -= 1
71+
left += 1
72+
73+
# ν˜„μž¬ μœˆλ„μš° 크기둜 μ΅œλŒ€ 길이 μ—…λ°μ΄νŠΈ
74+
max_length = max(max_length, right - left + 1)
75+
76+
return max_length
77+
78+
79+
80+

0 commit comments

Comments
Β (0)