백준 알고리즘

백준 2941번 : 크로아티아 알파벳 [문자열/C/C++]

TAEBAL_actual 2020. 4. 15. 21:11

문제 링크 : https://www.acmicpc.net/problem/2941

 

2941번: 크로아티아 알파벳

문제 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z= 예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다. dž는 무조건 하나의 알파벳으로 쓰이고,

www.acmicpc.net

문제 |

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

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

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다. dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

 

입력 |

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

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

 

출력 |

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

#include <stdio.h>
#include <iostream>
using namespace std;

int main(void)
{
	char ch[100] = { 0, };
	int count = 0;
	cin >> ch;
	for (int i = 0; i < 100; i++)
	{
		if (ch[i] != 0)
		{
			count++;
		}
		if (ch[i] == '=' || ch[i] == '-')
		{
			count--;
			if (ch[i - 1] == 'z' && ch[i - 2] == 'd')
			{
				count--;
			}
		}
		else if (ch[i] == 'j')
		{
			if (ch[i - 1] == 'l' || ch[i - 1] == 'n')
			{
				count--;
			}
		}
	}
	cout << count << endl;
	return 0;
}

원래 다이얼 문제 코드 리뷰를 하려고 했으나 문제를 너무 조잡하게 풀어서 다른 방법으로도 풀어보고 있는 중이다. 물론 이 문제도 리뷰가 지저분하긴 하지만 그나마 덜 노가다(?)스럽게 풀어서 이 문제부터 리뷰해보고자 한다.

 

문제 자체는 매우 간단하다. 글자수 세는 문제랑 크게 다를 바가 없다. 문제는 글자를 묶어서 세야한다는 건데 여기서 좀 머리를 썼다. 일단 글자수를 크로아티아 알파벳이든 아니든 무조건 센다. 그런 다음 크로아티아 알파벳 변경 문자들을 자세히 살펴보면 끝에 '=', '-', 'j' 이 3글자만 공통적으로 있는 것을 알 수 있다. 그렇다면 저 문자가 들어가 있다는 것은 크로아티아 알파벳이라는 의미이므로 글자수 세는 카운트에서 다시 차감해준다. 물론 j는 크로아티아 알파벳일 가능성도 있고 아닐 수도 있다. 여기서는 따로 검사를 해서 j 앞 글자가 'l'이거나 'n'이면 크로아티아 알파벳으로 인식하고 카운트를 차감해준다.

 

다만, 여기서 주의해야 할 점이 크로아티아 알파벳이 'dz='처럼 3글자가 되는게 있는데 여기서 카운트 차감을 한 번 더 넣어주지 않으면 한 글자가 미처 차감되지 않고 그대로 계산되어버린다. 그래서 끝에 =가 들어가면 이 글자는 무조건 크로아티아 알파벳이라는 뜻이므로 일단 count--을 넣어주고, 그 다음에 앞 글자와 앞앞 글자를 검사해서 3글자 크로아티아 알파벳인지 아닌지 분류하고 count--를 한 번 더 넣어준다.