[백준>구현>16503] 괄호 없는 사칙연산

Woonil·2022년 6월 29일
0

알고리즘

목록 보기
8/26
post-custom-banner

문제설명

연산 우선순위가 같은 곱셈과 나눗셈 또는 덧셈과 뺄셈만 있는 식에서는 보통 왼쪽에서 오른쪽 순서로 연산을 한다. 하지만 이런 상황에도 연산 순서에 따라 아래와 같이 두 가지 다른 결과가 나올 수 있다.
(6 ÷ 2) × 3 = 9
6 ÷ (2 × 3) = 1
만약 곱셈, 나눗셈, 덧셈, 뺄셈의 4가지 연산자의 연산 우선순위가 동등하다고 할 때, 괄호 없는 식에서 서로 다른 연산 순서의 계산 결과를 구하여라.

  • 입력
    첫 번째 줄에는 "K1 O1 K2 O2 K3" 형태로 식이 주어진다. 정수 Ki (1 ≤ Ki ≤ 1,000)는 피연산자를, 문자열 Oi는 곱셈(*), 나눗셈(/), 덧셈(+), 뺄셈(-) 중 한 가지 연산자를 의미한다.
    나눗셈 연산은 정수 나눗셈으로 몫만 취하며, 피연산자 중 하나가 음수이면 양수로 바꿔 계산한 결괏값에 음수를 취한다. 또한, 계산 과정에서 0으로 나누어야 하는 식은 주어지지 않는다.
  • 출력
    주어진 식에서 서로 다른 연산 순서의 계산 결과가 작은 것을 첫 번째 줄에, 큰 것을 두 번째 줄에 출력한다.

접근

곱셈, 나눗셈, 덧셈, 뺄셈의 4가지 연산자의 연산 우선순위가 동등
괄호의 위치에 따라 연산결과가 달라짐
"K1 O1 K2 O2 K3" 형태로 식이 주어진다
K1, K2, K3의 경우 숫자이므로 int형으로 형변환함

풀이

a, o_1, b, o_2, c = input().split()
k_1 = int(a)
k_2 = int(b)
k_3 = int(c)
# 피연산자들은 정수형으로 변환

# 이항연산하는 함수
def two_op_cal(op1, oper, op2):
  if oper == "+":
    return op1 + op2
  elif oper == "-":
    return op1 - op2
  elif oper == "*":
    return op1 * op2
  elif oper == "/":
    return int(op1 / op2)

# result1, result2 각각은 앞의 두개에 괄호를 친 경우, 뒤의 두개에 괄호를 친 경우
result1 = two_op_cal(two_op_cal(k_1, o_1, k_2), o_2, k_3)
result2 = two_op_cal(k_1, o_1, two_op_cal(k_2, o_2, k_3))

if (result1 < result2):
                print(result1)
                print(result2)   
else:
  print(result2)
  print(result1)코드를 입력하세요

다른 사람의 풀이

# 출처 - https://jinho-study.tistory.com/731
def f(a, b, op):
    if op == '+':
        return a+b
    elif op == '-':
        return a-b
    elif op == '*':
        return a*b
    elif op == '/':
        return -1*(abs(a)//abs(b)) if a*b < 0 else a//b

li = list(input().split())
li[0] = int(li[0]); li[2] = int(li[2]); li[4] = int(li[4])
a = f(f(li[0], li[2], li[1]), li[4], li[3])
b = f(li[0], f(li[2], li[4], li[3]), li[1])
print(min(a, b))
print(max(a, b))

배운점

  • input().split()으로 받은 문자열 중 일부만 문자열이 아닌 형태로 변환하는 경우가 생길 수 있음
  • 결과 출력부에서 min, max 함수로 간결히 표현 가능함
profile
우니리개발일지
post-custom-banner

0개의 댓글