이숭간 공부기록

[백준] 1541번 파이썬 _ 잃어버린 괄호 본문

알고리즘/백준

[백준] 1541번 파이썬 _ 잃어버린 괄호

이숭간 2021. 3. 17. 18:35
728x90

www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

문제유형 : 수학, 그리디, 문자열

 

문제풀이 :  괄호를 적절히 넣어 최솟값을 만드는 방법이므로

  • - 를 만나면 앞에 괄호를 넣는다.
  • 언제 괄호를 닫아주는가?
    • 그다음 - 를 만나면 괄호를 닫고 다시 괄호를 열여준다.
    • +일때는 계속 지나간다.
  • 만약 배열이 모두 끝났는데 아직 괄호가 열려있는 상태라면 맨 마지막에 괄호를 추가하여 닫아준다.
  • 괄호가 열려있냐 닫혀있냐의 여부는 flag변수를 통해 수행한다.

위 과정을 수행하면 다음과 같이 실행된다.

55-50+40

['55', '-', '(', '50', '+', '40', ')']

 

예외처리 : 숫자가 0으로 시작하는경우 ex) 0123-123 = 0 이 되어야한다.

한자리 숫자를 입력받아 num변수에 추가하다가 연산자가 나오면 해당 문자열을 int로 감싸서 0으로 시작부분을 없앨수 있게 하고 다시 문자열로 바꿔서 저장한다. (eval함수 사용위해)

 

 

기억해야할 스킬 :

  • 문자열로 된 수학식 계산하기 - eval()
  • 숫자인지 확인 - isdecimal() 숫자면 true반환
  • char형태로 받은 숫자를 기준에 따라(?) 숫자덩어리로 바꾸기 (4,3,2로 입력받은걸 432로 )
    • 기준점이 나오기전까지 빈 문자열 변수에 한자리수를 계속 더해서 저장하다가 기준점이 나오는순간 다른 배열에 그 숫자 문자열을 저장하고 다시 빈문자열로 초기화해주는 형식으로 수행한다.

 

정답코드:

import sys
input = sys.stdin.readline

#양수, +, -, 괄호
# 그후 괄호를 모두 지운다.
# 괄호를 적절히 쳐서 식의 최소값 만들기
# 55-50+40 일때 55-90으로 -35인 최소값을 만들수있다.

formular  = list(input())
flag = 0 #열려있는 괄호가 있는가 없는가
new_formular = []
num = ''

for i in formular:
    if not i.isdecimal():
        new_formular.append(str(int(num)))
        num = ''
    if i.isdecimal():
        num += i
    elif i=='-' and flag==0: # 처음만난 - = 괄호를 쳐야함
        new_formular.append(i)
        new_formular.append('(')
        flag = 1
    elif i=='-' and flag == 1: # 열려있는 괄호가 있는상황
        new_formular.append(')')
        new_formular.append(i)
        new_formular.append('(')
    elif i=='+':
        new_formular.append(i)

if flag==1:
    new_formular.append(')')

print(eval(''.join(new_formular)))

훨씬 간단하고 좋은코드..... split()을 연산자 기준으로 나눌생각을 왜 못햇지 바보다바보

import sys
input = sys.stdin.readline

arr = input().split('-')
print(arr)

s = 0
for i in arr[0].split('+'):
    print(i)
    s += int(i)
for i in arr[1:]:
    for j in i.split('+'):
        s -= int(j)
print(s)

 

 

210725 다시푼코드

import sys
input = sys.stdin.readline

fomula = input().strip()

fomula = fomula.split('-')
result = 0

for num in fomula[0].split('+'):
    result += int(num)

for f in fomula[1:]:
    for num in f.split('+'):
        num = int(num)
        result -= num

print(result)