본문 바로가기
알고리즘 문제풀이 연습/C언어

[C언어]백준 2941번

by seongjko 2023. 9. 12.
728x90

문제 

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

 

2941번: 크로아티아 알파벳

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

www.acmicpc.net

 

 

내 풀이 

#include <stdio.h>

int	is_it_croatia_alphabet(char *str, int i)
{
	if (str[i] == 'c' && str[i + 1] == '=')
		return (2);
	if (str[i] =='c' && str[i + 1] == '-')
		return (2);
	if (str[i] == 'd' && str[i + 1] == 'z' && str[i + 2] == '=')
		return (3);
	if (str[i] == 'l' && str[i + 1] == 'j')
		return (2);
	if (str[i] == 'n' && str[i + 1] == 'j')
		return (2);
	if (str[i] == 's' && str[i + 1] == '=')
		return (2);
	if (str[i] == 'z' && str[i + 1] == '=')
		return (2);
	return (0);
}

int main()
{
	char	str[105];
	int		i;
	int		cnt;

	scanf("%s", str);
	i = 0;
	cnt = 0;
	while (str[i])
	{
		if (is_it_croatia_alphabet(str, i))
		{
			i += is_it_croatia_alphabet(str, i);
			cnt++;
		}
		else if (str[i] == '-' || str[i] == '=')
		{
			i++;
		}
		else
		{
			i++;
			cnt++;
		}
	}
	printf("%d\n", cnt);

	return (0);
}

 

chatGPT 피드백 

제공해주신 코드는 백준 2941번 문제를 풀기에 적절한 방식으로 구현되어 있습니다. 코드의 로직은 크로아티아 알파벳과 '-' 또는 '='를 검사하고, 각각의 경우에 따라 문자열의 인덱스를 적절하게 이동하며 개수를 세는 방식으로 문제를 해결합니다.

 

1. scanf("%s", str);와 같이 %s 포맷을 사용하여 문자열을 입력받을 때, 주의해야 할 부분이 있습니다. 입력 문자열의 길이가 105 이하로 주어진 경우에는 이 코드가 문제 없이 동작할 것입니다. 그러나 더 안전한 방법은 fgets 함수를 사용하여 문자열을 입력받는 것입니다. 이렇게 하면 문자열 길이의 제한이 없어집니다.

2. 코드에서 is_it_croatia_alphabet 함수를 두 번 호출하는 대신, 한 번 호출한 결과를 변수에 저장하여 재사용할 수 있습니다. 이렇게 하면 코드의 가독성이 향상될 것입니다.

 

피드백을 보고 공부해야 할 부분

1. 정말로 scanf 함수는 입력 문자열의 길이가 105 이하일 경우에만 정상적으로 작동하는가? 그리고  scanf와 fgets의 차이점은?

2. 함수를 두 번 호출하는 것과, 한 번 호출한 결과를 변수에 저장하여 재사용하는 것 사이에는 정확히 어떤 차이점이 있기에 한 번 호출한 결과를 변수에 저장하여 사용하라고 하는가?

 

 

https://wikidocs.net/165874

 

026. scanf, scanf_s 함수

```{.c} int scanf(const char * format, … ); int scanf_s(const char * format, … ); ``` scanf와 sca…

wikidocs.net

 

 

반응형