본문 바로가기

코딩/백준 BOJ

[백준/C언어] 1316번 - 그룹 단어 체커

백준 웹사이트 "1316번 - 그룹 단어 체커" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net


소스 코드

#include <stdio.h>
#include <string.h>

int main(void){
    int N;
    scanf("%d", &N);

    int group_num = 0; //그룹 단어의 개수
    for(int i=0; i<N; i++){
        char word[101];
        scanf("%s", word);

        //그룹 단어인지 확인
        int alphabet[26]; //index 0 부터 a, b, ..
        for(int j=0; j<26; j++){
            alphabet[j] = 0;
        }

        int word_len = strlen(word);
        for(int k=0; k<word_len; k++){
            char letter = word[k];
            if(alphabet[letter-'a'] == 0){
                alphabet[letter-'a'] = 1;
            }
            else{ //이미 1이라면, 바로 앞 문자 확인
                if(word[k-1] != word[k]) //앞 문자와 다르다면, 그룹 단어가 아님
                    break;
            }

            if(k==word_len-1){ //여기까지 오면 그룹단어
                //printf("%s is a group word\n", word);
                group_num++;
            }
        }
    }
    printf("%d\n", group_num);
}

문제 풀이

  단어의 개수 N을 입력받고, 각 단어를 입력받는 과정은 이전 문제들과 비슷합니다. for문의 내부에서 단어를 입력 받을 때 단어의 최대 크기가 100이므로 크기 101의 배열로 선언하는 것만 주의하면 됩니다.

  Line 13부터 해당 단어가 그룹 단어인지 확인합니다. 우선 크기 26의 int 배열 'alphabet'을 선언하고, 값을 0으로 초기화합니다. 이 배열은 단어에 나타나는 문자를 기록하기 위한 배열로, 나타난 전적이 없다면 0의 값을 가지고 있다면 1의 값을 가집니다. Line 20의 for문에서는 입력 단어의 문자를 하나씩 확인하고, 'alphabet' 배열을 참고합니다. 해당 문자의 배열 값이 0이라면 1로 바꾸고, 이미 1이라면 바로 전 문자를 확인하여 서로 같은지 확인합니다. 만약 다르다면 그룹 단어가 아니므로 break로 for문을 빠져나가고, 다음 단어를 확인합니다. 빠져나가지 않고 Line 30까지 도달한다면, 검사하는 단어를 그룹 단어로 볼 수 있겠죠? 그룹 단어의 개수인 'group_num' 변수를 1만큼 증가시켜 이를 표시해주고, 마지막에 출력합니다.

반응형