#54. 백준 2941번 문제 풀이: 크로아티아 알파벳 문제 원본 보기
예전 운영체제에서는 크라아티아 알파벳을 입력할 수 없어서, 아래와 같이 알파벳을 변경해서 입력했다. 크로아티아 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z= 예를 들어 ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k) 이다. dž, lj, nj 는 분리될 수 없는 알파벳 하나로 본다. 단어가 주어졌을 때, 몇개의 크로아티아 알파벳인지 출력하시오. 입력: 100글자 이내의 단어 출력: 크로아티아 알파벳 수
입력/출력
--입력--
ljes=njak
--출력--
6
--입력--
ddz=z=
--출력--
3
--입력--
nljj
--출력--
3
--입력--
c=c=
--출력--
2
--입력--
dz=ak
--출력--
3
문제풀이+해설
주어진 단어문자열에서 한 글자씩 위치를 이동하면서 크로아티아 변경문자가 있는지 확인하면 된다.
--
단어
루프 (문자열 끝에 도달할 때 까지):
 단어문자열 다음글자씩 이동
 변경문자가 있으면 변경글자수 만큼 위치 추가 이동, 카운트 +1 증가
 변경문자가 없으면 위치 한글자 이동, 카운트 +1 증가
루프 끝
카운트 출력
--
문자열의 특정 부분부터 비교할 때 사용하는 요령을 익혀 두면 좋다. c 언어에서 strncmp(문자열1, 문자열2, 길이) 형식으로 되어 있다. 문자열1의 3번째 글자 부터 비교하고 싶다면, strncmp(문자열1 + 3, 문자열2, 길이) 처럼 써 주면 된다. 문자열1 + 3 은 포인터 표기법으로, 배열이 있다면 문자열1[3]의 주소와 같다.
code sol.
#include <stdio.h>
#include <string.h>

int main() {
  int i, j, l, count = 0, ck = 0, an = 0;
  // 크로아티아 알파벳 변경 문자들 목록
  char *ap[] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
  char wd[1001]; // 단어를 입력 받을 배열, 최대 100자
  scanf("%s", wd); // 단어를 입력 받는다.
  l = strlen(wd); // 단어길이
  i = 0; // 단어 위치 인덱스
  count = 0; // 알파벳 개수
  while(i < l) {
    ck = 0; // 변경 알파벳 체크 여부, 초기값 0
    for(j = 0; j < 8; j++) { 
      an = strlen(ap[j]); // 변경 알파벳 글자수
      if(strncmp(wd + i, ap[j], an) == 0) { // 변경 문자와 같으면 알파벳 개수 증가
        ++count; // 변경 문자수가 많더라도 하나만 증가
        i += an; // 변경된 알파벳 수 만큼 인덱스값 증가
        ck = 1; // 변경 알파벳 체크 여부, 1
        break; // 변경된 알파벳을 찾았으므로 추가 비교 중단.
      }
    }
    
    if(ck == 0) { // 일반 알파벳이면 count(카운트) 와 i(인덱스) 하나씩 증가
      ++count;
      ++i;
    }

  }
  printf("%d", count); // 알파벳 글자수 출력
  return 0;
}
© 코드솔 - CodeSol. All Rights Reserved.