728x90
문제
https://www.acmicpc.net/problem/2941
내 풀이
#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. 함수를 두 번 호출하는 것과, 한 번 호출한 결과를 변수에 저장하여 재사용하는 것 사이에는 정확히 어떤 차이점이 있기에 한 번 호출한 결과를 변수에 저장하여 사용하라고 하는가?
반응형