본문 바로가기

# 프로그래밍 개발/04. 알고리즘 문제풀이

백준 알고리즘 4101번 [크냐?] 문제풀이코드 공개 - 구현 문제

반응형

백준 알고리즘 4101번 크냐

문제

두 양의 정수가 주어졌을 때, 첫 번째 수가 두 번째 수보다 큰지 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 두 정수가 주어진다. 두 수는 백만보다 작거나 같은 양의 정수이다. 입력의 마지막 줄에는 0이 두 개 주어진다.

출력

각 테스트 케이스마다, 첫 번째 수가 두 번째 수보다 크면 Yes를, 아니면 No를 한 줄에 하나씩 출력한다.

출처

ICPC > Regionals > North America > Southeast USA Regional > 2009 Southeast USA Regional Programming Contest PA번

  • 문제를 번역한 사람: baekjoon
  • 문제의 오타를 찾은 사람: jh05013

알고리즘 분류

오잉.. ? 런타임 에러라니??

 

먼저 런타임 에러 판정이 나온 코드부터 보시겠습니다. 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main(){
	int a,b;
	int cnt = 0 ;
	char res[50][4] = {""};
	while(1){
		scanf("%d %d",&a,&b);
		if(a==0 && b==0)
			break;
		else if(a>b)
			strcpy(res[cnt++],"Yes");
		else
			strcpy(res[cnt++],"No");
	}
	for(int i = 0 ; i < cnt ; i++){
		printf("%s\n",res[i]);
	}
}

음.. 이렇게 봐서는 뭐가 문제였는지는 잘 모르겠네요. 

이제 정답 코드를 보시겠습니다. 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main(){
	int a,b;
	int cnt = 0 ;
	char res[100][4] = {""};
	while(1){
		scanf("%d %d",&a,&b);
		if(a==0 && b==0)
			break;
		else if(a>b)
			strcpy(res[cnt++],"Yes");
		else
			strcpy(res[cnt++],"No");
	}
	for(int i = 0 ; i < cnt ; i++){
		printf("%s\n",res[i]);
	}
}

아... 배열의 수가 조금 부족했던 모양입니다. 배열의 수가 부족하면 런타임에러가 발생하는건가..? 이것도 좀 신기하긴 하네요. 사이즈가 부족한게 런타임 에러로 이어지는지는 잘 모르겠습니다만 주의해야할 내용이긴 하죠. 계산을 했지만 계산 결과를 저장할 공간이 없어 문제가 풀리지 않으면 안 되는 것이니까요. 

근데 지금보니까 왜 이렇게 풀었는지는... 알수가 없네요. 그냥 풀면 되는데 굳이 strcpy 함수를 사용해서 답변을 다 저장한 뒤에 결과를 내놓았군요. 5년전의 나 매우 낯설다. 

 

그래서 파이썬으로 새로 풀어보기로 했습니다! 

while 1:
    a, b = map(int, input().split())
    if a == 0 and b == 0:
        break
    if a > b:
        print("Yes")
    else:
        print("No")

뭐 당연히 정답이겠지만... 메모리가 높아지는게 눈에 뛰네요. 역시 파이썬은 비 효율적인 녀석인가..? 

아무튼!  이번 문제 쉬우면서도 낯설게 느껴지는 녀석이었습니다! 

반응형