Skip to content

Commit 3fd1291

Browse files
committed
#244 solution
1 parent 8b1c5e3 commit 3fd1291

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
s는 영어 대문자만 포함 : 26의 크기를 가진 vector counts에 빈도 저장
3+
4+
left, right 통해 슬라이딩 윈도우 기법 적용
5+
6+
1. right 위치의 문자 빈도 수를 증가시키고 maxCnt를 업데이트한다
7+
- maxCnt는 현재까지 윈도우를 움직이면서 윈도우 내에 한가지 문자의 최대 빈도수
8+
9+
2. (윈도우의 크기 - maxCnt) > k일 때 최대 대체 가능한 문자의 수를 넘어섰으므로 윈도우의 크기를 줄임
10+
: s[left]의 빈도 감소 및 left를 전진
11+
12+
3. ans는 max(현재 윈도우의 크기, 기존 최대 크기 ans) 로 업데이트
13+
14+
15+
- ans의 증가는 maxCnt가 증가 | 최대빈도문자와 다른 문자가 k개 이하일 때 -> (maxCnt ~ maxCnt + k)로 업데이트
16+
이 때는 while 루프를 수행하지 않음
17+
18+
- while (right - left + 1 - maxCnt > k) -> 실제 이 조건을 만족하는 윈도우에서는 대체해야할 문자가 k보다 많이 존재할 수도 있다
19+
다만 윈도우의 크기를 maxCnt + k개로 제한하기 때문에 실제 답보다 더 크게 업데이트 될 수 없다
20+
매번 윈도우 내의 최대빈도문자를 계산하지 않아도 되기 때문에 살짝 최적화 O(26n) -> O(n)
21+
22+
s의 길이 : N
23+
24+
TC : O(N)
25+
26+
SC : O(1)
27+
상수(26) 크기의 배열
28+
*/
29+
30+
#include <string>
31+
#include <vector>
32+
using namespace std;
33+
34+
class Solution {
35+
public:
36+
int characterReplacement(string s, int k) {
37+
vector<int> counts(26, 0);
38+
int left = 0, right = 0, maxCnt = 0, ans = 0;
39+
40+
for(; right < s.size(); right++) {
41+
maxCnt = max(maxCnt, ++counts[s[right] - 'A']);
42+
43+
while (right - left + 1 - maxCnt > k) {
44+
--counts[s[left] - 'A'];
45+
left++;
46+
}
47+
ans = max(ans, right - left + 1);
48+
}
49+
return ans;
50+
}
51+
};

reverse-bits/sungjinwi.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
/*
2+
풀이 :
3+
n & 1 -> n의 오른쪽 첫번째 비트 -> ans에 더한다
4+
n >> 1 & 1 -> n의 오른쪽 두번째 비트 -> ans를 << 1 해준뒤 더한다
5+
...
6+
7+
n의 오른쪽 끝자리부터 ans에 더해져서 << 연산에 의해 좌측으로 가기 때문에 비트를 뒤집을 수 있다
8+
9+
TC : O(1)
10+
32번
11+
12+
SC : O(1)
13+
s*/
14+
115
#include <stdint.h>
216

317
class Solution {

0 commit comments

Comments
 (0)