갓비니

★코딩 문제 연습(7단계 / 백준 1316번 - 그룹단어 체커) C++ 본문

Programming/코딩 문제 풀이

★코딩 문제 연습(7단계 / 백준 1316번 - 그룹단어 체커) C++

갓비니 2021. 1. 25. 20:43

1316번

 

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++ , 다음 문자로 넘어가야한다.