★코딩 문제 연습(7단계 / 백준 1316번 - 그룹단어 체커) C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#include <iostream>
#include <string>
using namespace std;
int main() {
int number = 0;
int j = 0;
int count = 0;
string str;
cin >> number;
for (int i = 0; i<number; i++) {
cin >> str;
int switch_group[26] = { 0, };
switch_group[str[0] - 97] = 1;
for (j = 1; j<str.length(); j++) {
if (str[j - 1] != str[j]) {
int index = str[j] - 97;
if (switch_group[index] == 0)
switch_group[index]++;
else
break;
}
}
if (j == str.length())
count++;
}
cout << count;
}
|
cs |
for문은 for문 들어가기 전에 i값을 증가시키기 때문에
26번째 줄이 올 수 있는것이다!!
18번째 줄의 if는 전문자와 현문자가 다를 경우만을 다룬것이다.
그룹문자가 시작되는 이유 : 다른 문자로 바뀌는 과정으로부터 시작 이기 때문이다.
index의 역할은 각 알파벳의 자리에 등장한 횟수를 넣어주는 것이다.
만일 doododo일 경우
1. 첫번째 d의switch_group는 1이다 (나왔으니까) //15번째 줄
2. 두번째 o의switch_group는 14번째 줄에서 초기화됐다.
일단 첫번째 d와 값이 다르기때문에 18번째 if를 맞이하게 된다.
그 후 수상한녀석(!)이므로 index(o의 아스키코드 숫자-97)에 넣어준다.
넣고난 후 o의 switch_group는 0이므로 수상하지 않다 (그룹문자가 아니라는 의심을 안받음ㅎㅎ)
그러고 나서 이 친구는 확인된 알파벳 이라는 표식으로 21번째 줄, switch_group ++을 한다.
3. 세번째 o는 18번째 if에서 걸릴 것이 없으므로 다시 17번째 줄로가서 j++된다.
( 만일 doo였다면 j의 값 3 == str.length()의 값 3 이므로 검사에서 통과한 단어가 된다!
= 그룹문자 (count++) )
4. 네번째 d는 세번째 o와 값이 다르므로 18번째 줄 if를 맞이하게 된다.
역시 값이 달라지는 것은 수상하므로 index(d의 아스키코드-97)에 넣어준다.
switch_group의 값이 0이 아니므로 (이전에 d가 나왔던 적이 있으므로) 그룹문자가 아니다!
따라서 i++ , 다음 문자로 넘어가야한다.