코딩테스트/PYTHON

[백준][PYTHON] 1541번 잃어버린 괄호

_알파카 2024. 5. 30. 17:40
728x90

문제 

https://www.acmicpc.net/problem/1541

 

문제 접근

문제의 입력은 총 3가지 이다. 

예제 1의 경우

55-50+40 을 55-(50+40)으로 묶으면 원하는 출력값인 -35가 도출된다. 

 

예제 2의 경우, 10+20+30+40을 괄호없이 그냥 더하면 원하는 출력값인 100이 도출된다. 

 

예제 3의 경우에도 2와 같다. 

 

즉, '-' 뒤에 이어지는 '+' 연산을 모두 괄호로 묶어, 

가장 큰 값을 뺄셈하게 되면 값이 작아지게 된다. 

 

풀이 방법

55-50+40을 예로 들자. 

1. 먼저, '-' 를 기준으로 값을 나눈다. 

'55', '50+40'

 

2. '+' 기호가 있는 값은 덧셈 연산을 수행하고, '+' 기호가 없으면 그냥 정수로 변환한다. 

 

3. 2에서 구한 값을 sum_list에 저장한다. 

sum_list에는 '55', '90' 이 들어간다. 

 

4. sum_list의 값을 뺄셈 연산 진행한다. 

 

시도 1

런타임 에러 발생 -> 원인 : eval 함수

# 음수 뒤에 이어지는 덧셈 연산을 괄호로 묶기
import sys
exp = sys.stdin.readline()
# 뺄셈 기호를 기준으로 연산 나누기
new_exp = exp.split('-')
sum_list = []

# 덧셈 기호가 있다면 덧셈 수행, 없으면 그 값을 sum_list에 넣음
for i in new_exp:
    if '+' in i:
        sum_list.append(eval(i))
    else:
        sum_list.append(int(i))
        
# sum_list 안의 요소들 차례대로 뺄셈 진행
answer = sum_list[0]
for s in range(1, len(sum_list)):
    answer -= sum_list[s]
print(answer)

 

문제를 풀었지만, 런타임 에러가 발생하였다. 

곰곰히 생각해보았지만, 풀이 과정에는 따로 오류가 없는듯하였고, 

살짝 의심스러웠던 eval() 함수를 제거해보았다. 

프로그래머스 사이트에서 풀었을 때는 eval 함수가 정상적으로 작동하였지만, 

찾아보니 백준 사이트에서는 eval 함수가 모두 에러를 발생하는 것으로 보인다. 

(역시 eval 함수는 사용을 자제해야겠다;;)

 

정답 풀이

# 음수 뒤에 이어지는 덧셈 연산을 괄호로 묶기
import sys
exp = sys.stdin.readline()
# 뺄셈 기호를 기준으로 연산 나누기
new_exp = exp.split('-')
sum_list = []	# 뺄셈 연산을 수행할 리스트

# 덧셈 기호가 있다면 덧셈 수행, 없으면 그 값을 sum_list에 넣음
for i in new_exp:
    if '+' in i:
    	# 덧셈을 하기 위해 '+' 기호로 나누고 합을 구한다. 
        j = list(map(int, i.split('+')))
        sum_list.append(sum(j))
    else:
        sum_list.append(int(i))

# sum_list 안의 요소들 차례대로 뺄셈 진행
answer = sum_list[0]
for s in range(1, len(sum_list)):
    answer -= sum_list[s]
print(answer)
728x90