[백준] 2941. 크로아티아 알파벳

2023. 5. 16. 08:51코딩테스트/백준

[문제]

https://www.acmicpc.net/problem/2941

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

[풀이]

하나하나 비교했는데, 코드가 너무 깔끔하지 않다. 더 나은 코드가 없을까 하고 다른 사람들이 제출한 코드를 하나하나 뜯어봤다.

[내 코드]

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
	char s[101];
	int i, count=0;

	scanf("%s", s);

	for (i = 0; i < strlen(s); i++) {
		count++;
		if (i == strlen(s) - 1)
			break;

		if (s[i] == 'c') {
			if (s[i + 1] == '=' || s[i + 1] == '-')
				i++;
		}
		if (s[i] == 'd') {
			if (s[i + 1] == '-')
				i++;
			else if (s[i + 1] == 'z' && s[i + 2] == '=')
				i+=2;
		}
		if (s[i] == 'l' && s[i + 1] == 'j')
			i++;
		if (s[i] == 'n' && s[i + 1] == 'j')
			i++;
		if (s[i] == 's' && s[i + 1] == '=')
			i++;
		if (s[i] == 'z' && s[i + 1] == '=')
			i++;

	}

	printf("%d", count);
}

[더 나은 코드]

당연하게도 더 나은 풀이방법이 있었다 !

더 적게 등장하는 기호를 활용하기..

 

다시 짰다.

바꾸는 김에 계산하는데 시간이 많이 걸린다는 strlen(s)도 len 변수에 저장해서 사용했다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
	char s[101];
	int i, count=0, len;

	scanf("%s", s);
	len = strlen(s);

	for (i = 0; i < len; i++) {
		count++;
		if (s[i] == '=') {
			if (s[i - 1] == 'c' || s[i - 1] == 's')
				count--;
			if (s[i - 1] == 'z') {
				count--;
				if (s[i - 2] == 'd')
					count--;
			}
		}
		else if (s[i] == '-') {
			if (s[i - 1] == 'c' || s[i - 1] == 'd')
				count--;
		}
		else if (s[i] == 'j') {
			if (s[i - 1] == 'l' || s[i - 1] == 'n')
				count--;
		}

	}

	printf("%d", count);
}

... 왜 더 나아지지 않은 것 같지?

여하튼 효율적으로 코드를 짜기 위한 다양한 방법을 생각하는 능력을 키우자.