#include <iostream>
using namespace std;
int check(string word) {
int alpha[26] = { 0, };
int j = 0;
while (j != word.length()) {
if (j == 0) { //첫 번째 문자: 방문체크, j++
alpha[(int)word[j] - 97] = 1;
j++;
}
else {
if (word[j] == word[j - 1]) j++; //이전 문자와 같다면 j++
else{
//이전 문자와 다르다면:
// 방문체크되어있으면 break/ 안되어있으면 방문체크,j++
if (alpha[(int)word[j] - 97])
break;
else {
alpha[(int)word[j] - 97] = 1;
j++;
}
}
}
}
return j;
}
int main() {
int N;
cin >> N;
int ans = 0;
for (int i = 0; i < N; i++) {
string word;
cin >> word;
if (check(word) == word.length())
ans++;
}
cout << ans;
return 0;
}
처음에 i번째 문자와 i+1번째 문자를 비교해서 접근했다. 하지만 너어어어무 많이 튀어나오는 예외들!
질문게시판에 있는 모든 반례를 체크했는데도 틀렸습니다!가 떠서 질문게시판에 글도 남겼다.
하지만 또 튀어나오는 반례들로.. 문제 접근을 잘못했구나 완전 깨닫고 다시 풀었당 ㅎㅎ
[문제 풀이 생각 과정]
1. 이전에 나온 문자인지 확인하기 위해서 - 배열 alpha[26]을 만들었다.
2. 하나의 단어에 대해서 마지막 문자까지 확인하는 경우 = 그룹 단어라고 생각했다.
각 문자를 체크하고 그룹단어 조건에 맞는 경우 j++, 마지막 문자까지 확인했을 때 j==단어.length() 라면 그룹단어! 라고 판단
3. 첫 번째 문자는 말그대로 '첫 번째 문자'이기 때문에 생각하지 않는다.
4. 1) [i]=[i-1] 일때 : 연속해서 같은 문자가 나오는 경우이기 때문에 j++
2) [i]!=[j-1] 일때 : i번째 문자가 방문체크 되어 있는지 확인해야 된다.
- 방문체크O : 이전에 이미 나온 문자가 또 나온 경우! 그룹단어가 아니다. break
- 방문체크X : 새로 등장하는 문자다. 방문체크하고 j++
** 예외가 계속 튀어나온다면 - 문제 접근이 잘못된것!!! 다시 생각하자
'1d-1c > BOJ' 카테고리의 다른 글
11047_동전0 (JAVA) (0) | 2020.09.09 |
---|---|
11399_ATM (JAVA) (0) | 2020.09.09 |
2941_크로아티아 알파벳 (C++) (0) | 2020.08.26 |
5622_다이얼 (C++) (0) | 2020.08.26 |
2908_상수 (C++) (0) | 2020.08.26 |