BOJ(백준)

[C언어] 백준 16503 - 괄호 없는 사칙연산

ruming 2021. 2. 21. 22:45

문제

사칙연산에서 곱셈과 나눗셈은 덧셈과 뺄셈보다 먼저 계산한다. 덧셈과 뺄셈을 먼저 계산하고 싶을 때는 보통 가장 큰 연산 우선순위를 가지는 괄호를 사용하여 연산 순서를 지정한다. 예를 들어, 아래의 식은 연산 순서에 따라 두 가지 다른 결과가 나올 수 있다.

 

(2 + 3) × 4 = 20

2 + (3 × 4) = 14

 

연산 우선순위가 같은 곱셈과 나눗셈 또는 덧셈과 뺄셈만 있는 식에서는 보통 왼쪽에서 오른쪽 순서로 연산을 한다. 하지만 이런 상황에도 연산 순서에 따라 아래와 같이 두 가지 다른 결과가 나올 수 있다.

 

(6 ÷ 2) × 3 = 9

6 ÷ (2 × 3) = 1

 

만약 곱셈, 나눗셈, 덧셈, 뺄셈의 4가지 연산자의 연산 우선순위가 동등하다고 할 때, 괄호 없는 식에서 서로 다른 연산 순서의 계산 결과를 구하여라.

 

입력

첫 번째 줄에는 "K1 O1 K2 O2 K3" 형태로 식이 주어진다. 정수 Ki (1 ≤ Ki ≤ 1,000)는 피연산자를, 문자열 Oi는 곱셈(*), 나눗셈(/), 덧셈(+), 뺄셈(-) 중 한 가지 연산자를 의미한다.

나눗셈 연산은 정수 나눗셈으로 몫만 취하며, 피연산자 중 하나가 음수이면 양수로 바꿔 계산한 결괏값에 음수를 취한다. 또한, 계산 과정에서 0으로 나누어야 하는 식은 주어지지 않는다.

 

출력

주어진 식에서 서로 다른 연산 순서의 계산 결과가 작은 것을 첫 번째 줄에, 큰 것을 두 번째 줄에 출력한다.

 

 


 

입력에서 음수조건 때문에 하나하나 다 고려해줘야 되는 줄 알았는데 아니었다;; switch case문으로 4번 쓰면 해결되는데 코드가 너무 길어져서 함수로 만들었다.

#include <stdio.h>
int func(int a,char b,int c);
int main(void){
	int k1, k2, k3;
	char o1, o2;
	int r1 = 0, r2 = 0;
	scanf("%d %c %d %c %d", &k1, &o1, &k2, &o2, &k3);
	r1 = func(k1, o1, k2);
	r1 = func(r1, o2, k3);
	r2 = func(k2, o2, k3);
	r2 = func(k1, o1, r2);
	
	if(r1>r2)	printf("%d\n%d", r2, r1);
	else	printf("%d\n%d", r1, r2);
	return 0;
}
int func(int a,char b,int c){
	int r = 0;
	switch(b){
		case '+':	
			r = a+c;
			return r;
		case '-':	
			r = a-c;
			return r;
		case '*':
			r = a*c;
			return r;
		case '/':
			r = a/c;
			return r;
	}
}

입력받을 변수를 선언해주고, 원래 입력받을 때 %d와 %c사이를 붙여줬었는데 자료형이 달라서 그런지 입력이 잘 안되길래 사이에 공백을 주었다. func 함수를 만들어 연산자에 따라 계산해주고 그 결과를 리턴한다. 두번째 연산자를 먼저 계산할때는 조심해야 한다. k1 (연산자) r2 순으로 계산되기 때문이다. 순서를 헷갈리면 안된다. 마지막에는 if문으로 작은 것부터 출력해주었다.