해바

1316) 7. 문자열 : 그룹 단어 체커 본문

C, C++

1316) 7. 문자열 : 그룹 단어 체커

Bacha 2019. 8. 17. 23:44

문제

https://www.acmicpc.net/problem/1316

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다. 단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

풀이

처음 실행했을 때 또는 처음 입력하는 단어의 경우 이상하게 세는 경우가 있었지만, 코드만 봐선 이상이 없어 보여 대수롭지 않게 넘겼다. 이게 굉장히 잘못된 판단이었다.

원래는

scanf("%d", &repeat);
getchar();

이렇게 개행문자를 비웠는데 이걸

scanf("%d%*c", &repeat);

로 바꿔주니 바로 정답으로 인정해주었다. 구글링 하면 둘 다  개행 문자를 제거하는 데 사용하지만, 작동 방식은 약간 다르다.

 

getchar는 문자 하나를 받음으로써 버퍼를 비우고,

%*c는 받은 문자에서 하나를 누락시켜 데이터를 버린다.

 

즉 하나는 일단 버퍼에 갖다놓고 일부러 소비하는 방식이고, 다른 하나는 버퍼에 갖다 놓을 때 하나를 누락시킨 후 갖다 놓는다.

#include "cstdio"

int main() {
    int repeat(0), count(0);
    
    scanf("%d%*c", &repeat);						// getchar() 대신 사용
    
    for(int i(0); i < repeat; i++) {
        char alp('\0'), prev('\0');
        bool list[26]{}, check(false);
        
        while(alp != '\n') {
            alp = getchar();
            
            if(alp == '\n') break;
            if(list[alp - 97] == false) {
            // 처음 등장한 알파벳일 경우 체크
                list[alp - 97] = true;
                check = true;
            }
            else {
            // 이미 나왔던 알파벳이고, 이전 알파벳과 같지 않으면 그룹이 아니므로 체크 안함
                if(alp != prev) {
                    check = false;
                    while(alp != '\n') alp = getchar();
                }
            }
            prev = alp;
        }
        check == true ? count++ : count;				// 체크한 경우에만 세기
    }
    
    printf("%d\n", count);
    
    return 0;
}
Comments