본문 바로가기

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

백준 알고리즘 13420번 [사칙연산] 문제풀이코드 공개

반응형

 

문제

사칙연산은 덧셈, 뺄셈, 곱셈, 나눗셈으로 이루어져 있으며, 컴퓨터 프로그램에서 이를 표현하는 기호는 +, -, *, / 와 같다. 아래는 컴퓨터 프로그램에서 표현한 사칙 연산의 예제이다.

3 * 2 = 6

문제와 답이 주어졌을 때, 이를 계산하여 올바른 수식인지 계산하는 프로그램을 만들려고 한다. 만약 주어진 데이터가 3 * 2 = 6 이라면 정답으로, 3 * 2 = 7 이면 오답으로 채점을 하면 된다. 문제와 답이 주어졌을 때, 이를 채점하는 프로그램을 작성하시오.

입력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각 테스트 케이스의 첫 번째 줄에는 수식이 주어진다. 수식은 문자와 기호가 공백으로 구분되어 주어지고, 사칙연산 기호는 1개만 사용된다. 나눗셈의 경우 항상 나누어떨어지는 경우로만 주어진다.

출력

출력은 표준 출력을 사용한다. 입력받은 데이터에 대해, 각 테스트 케이스의 답을 순서대로 1줄에 1개씩 출력한다. 주어진 수식이 정답일 경우 “correct”를, 오답일 경우 “wrong answer”를 출력한다. 문제의 정답이 32비트 정수가 넘어갈 수 있다. 모든 범위가 부호가 있는 64비트 정수 이내이다.

출처

University > 국민대학교 > 2016 국민대학교 교내 경시대회 H번

알고리즘 분류

 

왜 틀렸을지 의문인데요.

5년 전의 저는 무슨 실수를 하였길래 틀렸는지 알아볼까요? 

#include<cstdio>

int main(){
	int tc;
	scanf("%d",&tc);
	int a,b,c;
	int yn = 0;
	char op,ep;
	while(tc--){
		scanf("%d %c %d %c %d",&a,&op,&b,&ep,&c);
		yn = 0;
		switch(op){
		case '=':
			switch(ep){
			case '+':
				if(a == b+c)
					yn = 1;
				break;
			case '-':
				if(a == b-c)
					yn = 1;
				break;
			case '*':
				if(a == b*c)
					yn = 1;
				break;
			case '/':
				if(a == b/c)
					yn = 1;
				break;
			}
			break;
		case '+':
			if(a+b == c)
				yn = 1;
			break;
		case '-':
			if(a-b == c)
				yn = 1;
			break;
		case '*':
			if(a*b == c)
				yn = 1;
			break;
		case '/':
			if(a/b == c)
				yn = 1;
			break;

		}
		if(yn == 1){
			puts("correct");
		}else
			puts("wrong answer");
	}
}

변수의 범위를 잘못 설정한 것이 오류의 원인인 것 같습니다. 

반응형

정답코드는 이것입니다

#include<cstdio>

int main(){
	int tc;
	scanf("%d",&tc);
	long long int a,b,c;
	int yn = 0;
	char op,ep;
	while(tc--){
		scanf("%lld %c %lld %c %lld",&a,&op,&b,&ep,&c);
		yn = 0;
		switch(op){
		case '=':
			switch(ep){
			case '+':
				if(a == b+c)
					yn = 1;
				break;
			case '-':
				if(a == b-c)
					yn = 1;
				break;
			case '*':
				if(a == b*c)
					yn = 1;
				break;
			case '/':
				if(a == b/c)
					yn = 1;
				break;
			}
			break;
		case '+':
			if(a+b == c)
				yn = 1;
			break;
		case '-':
			if(a-b == c)
				yn = 1;
			break;
		case '*':
			if(a*b == c)
				yn = 1;
			break;
		case '/':
			if(a/b == c)
				yn = 1;
			break;

		}
		if(yn == 1){
			puts("correct");
		}else
			puts("wrong answer");
	}
}

 

솔직히 long long int 와 같은 변수형은 현업에서 거의 쓰이지 않습니다. 

물론 특정 분야에서는 쓰일 수 있죠, 데이터 단위가 시계열 처럼 엄청 많은 곳이라면 쓰일텐데

굳이 이러한 자료형이 아닌 자료구조로 변환해 사용하는 것이 더 깔끔하겠죠? 

 

이 문제의 목적은 모든 범위가 부호가 있는 64비트 정수 이내이다. 

라는 문구를 보고, 자료형을 어느 수준으로 산정해야되는지 묻는 문제이었을 것 같습니다. 

 

알고리즘 코딩 테스트를 준비하고 계신 분들이라면, 이러한 자료형 선정에 항상 고심해야 하는데요

자료형이라는 단순한 문제 때문에 코딩 테스트에서 문제를 틀리면 안 되겠죠?

비트 단위 자료형 크기에 대한 테이블

위의 테이블을 보시면, 비트 단위 순서 혹은 자료의 크기에 따라 

어떤 자료형까지 가능한지 나와있습니다. 

솔직히 이걸 외우라고 하는 것은 무리이고요. 이런 형태로도 쓸 수 있구나 정도만 참고하시면 될 것 같습니다! 

 

반응형