Dev2yup의 프로그래밍 이야기 🖥 💻

C

[41] C 백준 2941번 크로아티아 알파벳 문제 (문자열)

엽동이 2022. 8. 12. 01:35

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳                                                               변경
č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

예제 입력 1 

ljes=njak

예제 출력 1 

6

예제 입력 2 

ddz=z=

예제 출력 2 

3

예제 입력 3 

nljj

예제 출력 3 

3

예제 입력 4 

c=c=

예제 출력 4 

2

예제 입력 5 

dz=ak

예제 출력 5 

3

 

 

<풀이>

1. strstr()함수를 이용한다. strstr함수는 strstr(arr, abc)라고 한다면 문자열 arr에서 abc로 시작하는 문자열의 포인터를 반환한다. 검색한 문자만 나오는 것이 아닌 NULL이 오기 전까지 반환한다. <string.h> 라이브러리에 존재한다.

https://dojang.io/mod/page/view.php?id=371 strstr() 참고

 

2. NULL이 반환될 때까지  재검사하며 한 알파벳의 사용 횟수 구한다. strlen()을 사용해 처음의 글자 수를 구하고 만약 세글자인 dz=가 사용 되었다면 글자수 - 2, 그 외엔 글자수 - 1을 해준다.

 

3. strstr()함수를 사용하면 문제점이 발생한다. z=를 검색했을 때 알파벳 dz=가 있다면 검색 결과로 나오기 때문이다.

--> for문을 이용하여 문자열[i] == 'z'일 때 문자열[i-1] == 'd'라면 글자 수를 줄이지 않는다.

 

<제출한 코드>

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

int main(void){
    char alphabet[8][4] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
    char inputWord[101];
    char ptrWord;
    char *ptr;
    int len;

    scanf("%s", inputWord);
    len = strlen(inputWord);
    for (int i = 0; i < 8; i++){
        if (i == 2){ // dz=일 때(세 글자)
            ptr = strstr(inputWord, alphabet[i]);
            while (ptr != NULL){ //NULL일 경우는 더이상 이 알파벳이 사용 X
                len -= 2; //두 글자를 뺀다
                ptr = strstr(ptr + 3, alphabet[i]); //ptr + 3(dz= 이후)부터 재검사
            }
        }

        else if (i == 7){ // z=일 때 dz=이어도 strstr()이 작동하기 때문
            for (int i = 0; i < strlen(inputWord); i++){
                if (inputWord[i] == 'z'){
                    if (inputWord[i - 1] != 'd' && inputWord[i + 1] == '=') len--;
                    // z 앞에 d가 없고 뒤에가 =인 경우 길이 -1
                }
            }
        }
        
        else{ // 그 외(두 글자)
            ptr = strstr(inputWord, alphabet[i]);
            while (ptr != NULL){
                len --; //두 글자를 뺀다
                ptr = strstr(ptr + 2, alphabet[i]);// ptr + 2부터 재검사
            }
        }
    }
    printf("%d\n", len);
    
    return 0;
}