본문 바로가기

문제풀이

[C언어] 백준 2941 크로아티아 알파벳

#include <stdio.h>

int main(void)
{
    char word[100+1];
    int i, cnt = 0;

    scanf("%s", word);

    for (i = 0; word[i] != '\0'; i++, cnt++)
    {
        switch (word[i])
        {
        case '=':   
        case '-':
            cnt--;
            break;
        case 'd':
            if (word[i+1] == 'z' && word[i+2] == '=')
                cnt--;
            break;
        case 'l':
        case 'n':
            if (word[i + 1] == 'j')
                cnt--;
        }
    }

    printf("%d", cnt);
    return 0;
}

 

  • switch문 사용
    word[i]의 값이 몇 가지 경우 안에서 상수로 정해져 있기 때문에 switch문을 써서 코드를 단순화
    if문을 쓸 경우 매번 조건문에 word[i]를 반복하게 된다.
  • Relational Expression(&&)
    첫번째 expression이 fail하면 다음 조건을 검사하지 않는다.
    순서만 잘지키면 word[i+2]에서 메모리에러가 날 일이 없다.
    • 패턴1 = 혹은 -로 끝날때
      : =와 -는 일반적인 알파벳이 아니기 때문에 다른 조건체크 필요없이 바로 글자수 차감
    • 패턴2 j로 끝날때
      : j는 일반적인 알파벳이기 때문에 lj, nj 두가지 조합인지를 조건검사해야한다.
       word[i]가 j일때 word[i-1]로 하지 않은 이유는 j로 시작하는 단어가 올 수도 있기 때문에
    • 패턴3 dz=
      : dz=은 세 글자가 하나의 글자로 취급되면서 =를 포함하고 있는 특수한 경우이다.
      case 수행부 작성시 단순히 dz=이 올때 글자수를 -2차감하게 된다면, word[i]가 =을 검사할 때 다시 1을 차감하여 문제가 된다. 이를 고려해 -1만 차감한다.

 

 

 

 

 

 

 

'문제풀이' 카테고리의 다른 글