https://www.acmicpc.net/problem/16472
16472번: 고냥이
고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고
www.acmicpc.net
투 포인터 알고리즘을 사용하는 골드4 문제.
문자열의 길이 S가 1e6으로 커서 투 포인터 알고리즘을 사용해야 한다.
구간 [s,e] 안에 있는 알파벳의 종류가 N을 넘지 않도록 관리해주면 된다.
알파벳의 종류를 세주기 위해서, 일반적이라면 map<char,int> 등을 만들어서 관리하게 될 텐데,
char 가 0~255 사이의 숫자 아스키코드에 대응한다는것을 통해
그냥 256개의 배열을 만드는 방법으로 map<char,int> 를 대체할 수 있다.
메모리를 더 아끼고 싶다면 알파벳 갯수인 26개만 만들고, arr[S[i]-'a'] 등으로 접근할 수 있겠지만,
그렇게까지 메모리를 아껴야 할 필요성이 있는 문제는 아니라서
그냥 해결했다.
s와 e 두개의 변수를 잡고 돌리는 투 포인터 알고리즘을 사용할 때에는
구간의 양끝을 포함시킬지, 포함시키지 않을지에 대해 헷갈리기 쉽다.
본인만의 기준을 만들어 놓던지 놓치는 부분 없도록 깔끔하게 작성하도록 하자.
필자도 이거때문에 몇번 틀렸다 ㅠㅠ
#include <bits/stdc++.h>
using namespace std;
int cnt[256] = {0};
int main(){
int N;
string S;
cin >> N;
cin >> S;
int s=0;
int e=0;
cnt[S[0]]++;
int now = 1;
int ans = 1;
while(e<S.length()){
if(now <= N){
ans = max(ans, e-s+1);
e++;
if(cnt[S[e]] == 0) now++;
cnt[S[e]]++;
}
else{
cnt[S[s]]--;
if(cnt[S[s]] == 0) now--;
s++;
}
}
cout << ans;
return 0;
}
반응형