일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- php 프로그래밍 입문 연습문제
- 한정 분기
- 페이코 추천인코드
- 배열
- 플러터
- SWEA
- 파이썬
- php 프로그래밍 입문
- 백준
- php 프로그래밍 입문 문제풀이
- php
- C
- spring
- Flutter
- C언어
- 자바 스프링
- JAVA SPRING
- Java
- 페이코 초대코드
- programmers
- 스프링
- 페이코 친구코드
- 플러터 개발환경 설정
- 자바
- php 프로그래밍
- php 프로그래밍 입문 솔루션
- 페이코 추천인
- php 프로그래밍 입문 예제
- 최단 경로
- php 프로그래밍 입문 3판
- Today
- Total
ImJay
[C언어] 백준 2941번 : 크로아티아 알파벳 본문
백준 2941번 : 크로아티아 알파벳
- 사용언어 : C언어
1. 문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
č | c= |
ć | c- |
dž | 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=의 경우 세개의 글자가 하나의 알파벳이기 때문입니다.
- 위와 같은 방법으로 나머지 알파벳들도 구분을 해주시면 간단하게 알파벳을 세줄 수 있습니다.
'백준 - C, C++ > 07. 문자열' 카테고리의 다른 글
[C언어] 백준 5622번 : 다이얼 (0) | 2020.10.26 |
---|---|
[C언어] 백준 2908번 : 상수 (0) | 2020.10.21 |
[C언어] 백준 1152번 : 단어의 개수 (0) | 2020.10.21 |
[C언어] 백준 1157번 : 단어 공부 (0) | 2020.10.20 |
[C언어] 백준 2675번 : 문자열 반복 (10) | 2020.10.17 |