https://www.acmicpc.net/problem/23629
22/09/24
문제에서 요구하는 바를 차근차근 따라가면 쉽게 구현할 수 있는 문제로, 나눗셈의 구현만 조심해서 구현하면 된다.
문제 접근 방식:
문제에서 첫 번째로 요구하는 것은 문자열로 주어진 수식을 숫자로 바꾸는 것이다.
나는 이를 구현하기 위해 파이썬의 replace메서드를 활용하여 문자열을 입력받으면 이를 모두 숫자로 바꿔주었다.
그리고 수식은 연산자를 기준으로 분리가 되므로, 연산자를 모두 같은 문자로 치환 후에 그 문자를 기준으로 split을 해주었다.
이 과정을 통해 만들어진 리스트는 숫자로 된 문자열이 담겨 있는 리스트이다.
수식이 만들어지지 않는 경우는 연산자 두개가 동시에 붙어있을 때인데, 이때 split함수를 사용하면 빈 문자열이 나오므로, 이를 활용하여 예외처리를 진행함으로써 Madness! 를 출력하도록 해주었다.
또한, 숫자 문자열이 담겨져 있는 리스트와 연산자만 담겨 있는 리스트를 따로따로 만들어서 순서대로 연산을 진행했다.
이때, 당연히 나눗셈을 구현할 때 0과 가까운 쪽으로 나눗셈을 진행한다고 했으므로 나눗셈을 한 결과가 음수면 ceil함수를, 양수면 floor함수를 사용하여 구현하였다.
이후 최종적으로 나온 숫자를 문자열로 바꾸고, 이를 다시 replace메서드를 활용하여 영어로 된 문자열로 출력하게 만들었다.
아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.
# 23629번 이 얼마나 끔찍하고 무시무시한 수식이니
# 문자열
from math import *
replace_list = ['ZERO', 'ONE', 'TWO', 'THREE', 'FOUR',
'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE']
op_list = ['+', '-', 'x', '/']
op_stack = []
S = input()
for i in range(10):
S = S.replace(replace_list[i], str(i))
k = S
for op in op_list:
k = k.replace(op, ',')
for char in S:
if char in op_list:
op_stack.append(char)
try:
num_li = list(map(int, k.rstrip('=').split(',')))
total_value = num_li[0]
for i in range(len(op_stack)):
if op_stack[i] == '+':
total_value += num_li[i+1]
elif op_stack[i] == '-':
total_value -= num_li[i+1]
elif op_stack[i] == 'x':
total_value *= num_li[i+1]
else:
total_value /= num_li[i+1]
if total_value < 0:
total_value = ceil(total_value)
else:
total_value = floor(total_value)
total_value = str(total_value)
for num in total_value:
if num in op_list:
continue
total_value = total_value.replace(num, replace_list[int(num)])
print(S)
print(total_value)
except ValueError:
print('Madness!')
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 9918번 Cube / 2642번 전개도 (0) | 2022.10.21 |
---|---|
[Python] 14382번 숫자세는 양 (Large) (0) | 2022.10.21 |
[Python] 4349번 Blocks (0) | 2022.10.20 |
[Python] 1455번 뒤집기 II (0) | 2022.10.20 |
[Python] 10255번 교차점 (0) | 2022.10.20 |