반응형
https://www.acmicpc.net/problem/16472
16472번: 고냥이
고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고
www.acmicpc.net
#문제 해결 방법
투 포인터를 사용하자
#전체 코드
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
string s;
cin >> s;
int st = 0, en = 0;
int maxLength = 0;
int curType = 0;
int alpha[26] = { 0, };
while (en < s.length()) {
if (alpha[s[en] - 'a'] == 0) curType++; // 새로운 알파벳 타입을 발견
alpha[s[en] - 'a']++;
while (curType > n) { // 허용된 타입을 초과하면 앞에서부터 제거
if (--alpha[s[st] - 'a'] == 0) curType--;
st++;
}
maxLength = max(maxLength, en - st + 1); // 최대 길이 갱신
en++;
}
cout << maxLength << endl;
return 0;
}
#코드 설명
- 변수 설정
- int st = 0, en = 0; : 투 포인터 알고리즘에서 사용할 시작 포인터(st)와 끝 포인터(en)를 초기화합니다.
- int maxLength = 0; : 최대 문자열 길이를 저장할 변수입니다.
- int curType = 0; : 현재 연속된 문자열에서의 알파벳 종류의 수를 저장합니다.
- int alpha[26] = { 0, }; : a부터 z까지의 알파벳이 현재 연속된 문자열에서 몇 번 나타났는지를 저장하는 배열입니다.
- 투 포인터 알고리즘
- while (en < s.length()) : 끝 포인터(en)가 문자열의 길이보다 작은 동안 반복합니다.
- if (alpha[s[en]-'a'] == 0) curType++; : 끝 포인터가 가리키는 알파벳이 현재 연속된 문자열에 처음 등장하면 알파벳 종류의 수(curType)를 1 증가시킵니다.
- alpha[s[en]-'a']++; : 해당 알파벳의 등장 횟수를 1 증가시킵니다.
- while (curType > n) : 알파벳 종류의 수가 N을 초과하면, 시작 포인터를 하나씩 이동시키면서 초과된 알파벳 종류의 수를 줄입니다.
- maxLength = max(maxLength, en - st + 1); : 최대 문자열 길이를 갱신합니다.
- en++; : 끝 포인터를 1 증가시킵니다.
- while (en < s.length()) : 끝 포인터(en)가 문자열의 길이보다 작은 동안 반복합니다.
반응형
'[백준] > C++' 카테고리의 다른 글
백준 1309번 동물원 [C++] (1) | 2023.12.17 |
---|---|
백준 15961번 회전 초밥 [C++] (2) | 2023.10.31 |
백준 1005번 ACM Craft [C++] (0) | 2023.10.27 |
백준 11053번 가장 긴 증가하는 부분 수열 [C++] (0) | 2023.09.26 |
백준 16194번 카드 구매하기 2 [C++] (0) | 2023.09.25 |