백준 11047: 잃어버린 괄호 (python

MineeHyun·2024년 1월 30일

문제 풀이

목록 보기
8/25
post-thumbnail

문제


세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

입력


첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.

출력


첫째 줄에 정답을 출력한다.

풀이


처음 시도한 풀이

def solution():
  inp = list(map(str, input().split('-')))
  answer = 0
  for i in range(len(inp)):
    temp = eval(inp[i])
    answer += (-1)**i * temp
  return answer
print(solution())

이 방법에는 문제가 있다.
00009-00009와 같이 0으로 시작하는 숫자가 입력되었을 때, eval 함수가 처리하지 못한다.
어떻게 하면 좋을지 몹시 고민하다가... 아래와 같이 해결했다.

문제를 해결한 코드 (정답 처리)

  1. input을 string 타입으로 받는다.
  2. number 리스트에, inp의 부호를 기준으로 split한 숫자들을 넣는다.
  3. number는 list<str>이고, numbers는 list<int>이다.
    number의 str들을 numbers에 int로 바꾸어 넣는다.
  4. sign 리스트를 만들기 위해 inp를 list화 한다 (inp_s). inp_s를 하나씩 순회하면서 부호가 -면 0, +면 1을 sign에 append한다.
    • 여기서 sign = [1]로 초기화하면, numbers와 인덱스를 맞출 수 있다.
  5. temp는 str로 선언한다. sign이 1이면 '+'를 더하고, sign이 0이면 '-'를 더한다.
  6. temp.split('-') 하면 temp는 -를 기준으로 split된 list가 된다.
  7. temp의 길이만큼, 반복문을 돌며 첫 번째 원소는 answer에 더해주고, 나머지는 합을 구해 뺀다.
def solution():
  inp = str(input())
  number = inp.replace('+', '.').replace('-', '.')
  number = number.split('.')
  numbers = []
  
  for i in range(len(number)):
    numbers.append(int(number[i]))
  
  inp_s = list(inp)
  sign = [1]
  for i in range(len(inp_s)):
    if (inp_s[i] == '-'):
      sign.append(0)
    elif(inp_s[i]=='+'):
      sign.append(1)
  temp = ''
  for i in range(len(numbers)):
    if (sign[i]==0):
      temp = temp + '-'
    else: 
      temp = temp + '+'
    temp = temp + str(numbers[i])
  temp = temp.split('-')
  answer = 0
  
  for i in range(len(temp)):
    if i == 0:
      answer += eval(temp[i])
    else: 
      answer -= eval(temp[i])  
  return answer
  
print(solution())

너무나도 복잡하고 이상하게 풀고 있다고 생각하면서도... 일단 풀겠다는 마음으로...
생각하고 쓴 게 아니라 일단 쓰고 덕지덕지 붙여가며 쓴 코드라 복잡하고 이상하다.
어떤 코드가 왜 들어갔는지 나도 정확히 이해를 못하고 있어서, 벨로그 쓰면서 뺴도 될 것 같은 부분 뺐다가 오류 나고 다시 넣고 이유 쓰고... 했다.
그래도 얻어가는 것: eval을 써봤다.

다른 풀이는 없을까? (구글링... TBD...)

분명 더 현명한 풀이가 있을 것이다. 찾아보자...

0개의 댓글