반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
12-01 10:12
관리 메뉴

ImJay

[C언어] 백준 2941번 : 크로아티아 알파벳 본문

백준 - C, C++/07. 문자열

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

ImJay 2020. 11. 19. 00:00
반응형

백준 2941번 : 크로아티아 알파벳

- 사용언어 : C언어

www.acmicpc.net/problem/2941

1. 문제

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

č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

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

 

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

2. 코드

#include <stdio.h> 
#include <string.h> 
 
int main(void) { 
  char ap[100]; 
  gets(ap); 
  int cnt = strlen(ap); 
  int i; 
  for(i=0; i<strlen(ap); i++) { 
    if(ap[i] == '=') { 
      if(ap[i-1] == 'c') cnt--; 
      if(ap[i-1] == 's') cnt--; 
      if(ap[i-1] == 'z') { 
        cnt--; 
        if(ap[i-2] == 'd') cnt--; 
     } 
  } 
  if(ap[i] == '-') { 
    if(ap[i-1] == 'c') cnt--; 
    if(ap[i-1] == 'd') cnt--; 
 } 
 if(ap[i] == 'j') { 
   if(ap[i-1] == 'l') cnt--; 
   if(ap[i-1] == 'n') cnt--; 
} 
} 
printf("%d\n", cnt); 
} 

3. 풀이

 

일차원적으로 각 크로아티아 알파벳이 입력으로 들어오면 그만큼 갯수를 세주면 된다고 생각하실 수 있지만,

 

그렇게 하려면 z=와 dz=가 중복되어 또 다시한번 빼줘야하고, 점점 복잡해집니다.

 

제가 생각한 방법은 다음과 같습니다.

총 글자 수 - 크로아티아 알파벳의 갯수 = 총 알파벳의 수

입력이 ddz=z= 일 경우를 예시로 들어보겠습니다.

 

int cnt = strlen(ap); // cnt = 6

 

- cnt는 총 글자 수이며 6글자입니다.

 

if (ap[i] == '=');

 

- 크로아티아 알파벳을 세주기 위함이며 dz=, z=가 위 조건식에 해당합니다.

 

if (ap[i-1] == 'z') {

cnt--; // dz=, z=의 경우 위에 해당하므로 cnt = 4가 됨.

if(ap[i-2] = 'd') cnt--; // dz=의 경우 위에 해당하므로 cnt = 3이 됨.

}

 

- ap[i]가 '='라면, 그 바로 앞에 있는 문자 ap[i-1]이 c,s,z 중 하나일 것입니다.

 

그 중에서 ap[i-1]가 z일 경우로, dz=와 z=가 위 조건식을 만족 시킵니다.

 

우선 첫번째 조건을 만족시킬 경우 cnt--;로 글자의 갯수를 하나 줄여줍니다.

 

왜냐하면 z=의 경우 두개의 글자가 하나의 알파벳이기 때문입니다.

 

그 다음, 두번째 조건식을 통해 ap[i-2]가 d일 경우, 즉 dz=일 경우 cnt--;로 글자의 갯수를 하나 더 줄여줍니다.

 

왜냐하면 dz=의 경우 세개의 글자가 하나의 알파벳이기 때문입니다.

 

 

- 위와 같은 방법으로 나머지 알파벳들도 구분을 해주시면 간단하게 알파벳을 세줄 수 있습니다.

 

반응형
Comments