* 백준 1541번 - 잃어버린 괄호

Gyuhan Park·2021년 11월 7일
0

코딩테스트 정복

목록 보기
22/47

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

# 오류코드

처음엔 숫자를 아예 나눠버렸다. "-"를 만나면 -까지 붙인 숫자를 저장하고 "+"를 만나면 +는 빼고 숫자만 저장해서 모든 숫자를 하나의 리스트에 저장했다. 그러고 반복문으로 2개씩, 3개씩.....하다보니까 말이 안된다. 자릿수가 늘어나면 어떻게 할건가?
다시 생각해보자. 이번엔 아예 괄호까지 포함시킨 수식을 문자열로 저장해 eval() 명령어로 수식값을 얻어내는 방식이다. 괄호는 숫자앞에밖에 못오니까 문자열을 잘라서 넣어본 결과값을 다 저장한 다음에 최솟값을 얻어내자!!!! 완벽하다 생각했지만 0이 앞에 붙는 경우 계산이 안되서 Error.
0을 지우는 경우도 생각해봤지만 모든 0을 지우는 것도 아니고 의미있는 0과 의미없는 0을 구분해야 한다. 머리가 복잡해진다. 다른 방법은 없을까?

expression = input()
sumSet = set()

expression = expression + ")"
temp = "(" + expression

sumSet.add(eval(temp))
for i in range(len(expression)-1):
  if not expression[i].isdigit():
    
    temp = expression[0:i+1] + "(" + expression[i+1:-1] + ")"
    sumSet.add(eval(temp))
print(min(sumSet))

# 참고코드

고민했던 문제가 단순한 코드로 끝나니 허무하긴하다. 문제에서 최솟값을 얻어내는 데에 집중해보면 빼는 수가 크면 되는 것이다. 빼는 수에 욕심을 부려라! "-"를 만나면 다음 "-" 까지, 다음 "-"가 없다면 끝까지 모든 수를 더해서 한 번에 빼 주면 문제에서 원하는 답을 얻을 수 있다. "-"가 아예 없는 경우엔 그냥 다 더한다.

arr = input().split('-') # "-"를 기준으로 자른다
s = 0 
for i in arr[0].split('+'): # "-"가 나오기 전 문자열을 "+"기준으로 잘라 다 더한다
	s += int(i) 
for i in arr[1:]: 
    for j in i.split('+'): # "-"를 기준으로 잘랐기 때문에 arr 각각의 요소의 합을 모두 빼면 최솟값
    	s -= int(j) 
print(s)

출처: [참고 블로그]

profile
단단한 프론트엔드 개발자가 되고 싶은

0개의 댓글