백준
백준 1316 c++ 풀이
ris
2024. 7. 14. 18:00
이번 문제는 굉장히 간단한 문제였다.
물론 필자는 오래걸렸다.
다음은 올바른 코드이다.
#include<iostream>
#include<string>
using namespace std;
int main(){
int a[26] = {0,};
int t;
int cnt = 0;
bool pass = false;
string input;
cin >> t;
for(int i = 0; i < t; i++){
cin >> input;
pass = true;
for(size_t j = 0; j < input.length(); j++){
if(j != 0 && a[static_cast<int>(input[j]) - 97] == 1 && input[j-1] != input[j]){
pass = false;
break;
} // index 0 제외, 문자가 이미 있을 때, 바로 앞의 문자가 나와 다를 때
a[static_cast<int>(input[j]) - 97] = 1; // a의 ascii = 97
}
if(pass){
cnt++;
}
fill(begin(a), end(a), 0);
}
cout << cnt;
return 0;
}
복잡해보이지만 천천히 보면 굉장히 간단한 과정을 거친다.
문제에서는 문자열이 주어질 때 그 문자열에서 각 문자가 연속해서 나타나는 경우만을 말한다.
고로 연속해서 나타나지 않는 경우를 제하고 남은 것만들 더하면 된다.
연속하지 않는 경우 : 이미 나온 문자임에도 연속하지 않고 나온 경우.
string 라이브러리를 사용해 입력받았고 이미 나온 알파벳의 확인을 위해 임의의 배열을 생성했다.
그리고 한 글자씩 확인해 넣었고 만일 해당 문자가 이미 나온 문자이고 바로 전 문자가 해당 문자와 다를 경우에 반복을 취소, 다른 문자를 받아왔다.
굉장히 간단한 문제임에도 세세한 부분이 꽤나 복잡했던 문제였다.