본문 바로가기

개발/Algorithm

[Algorithm] 백준 BOJ 1541 잃어버린 괄호 python 파이썬 그리디 실버 2

Private 난이도 : ♥♥♥♡♡
 

1541번: 잃어버린 괄호

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

www.acmicpc.net

import sys
formula=sys.stdin.readline().strip()

plus_split_formula=formula.split('+') # 일단 +로 먼저 split
splitted_formula=[] #완전히 숫자만 저장될 리스트
for f in plus_split_formula:
    splitted=f.split('-') # +로 나뉜 리스트들을 하나씩 가져와서 -로 나눈다
    for ff in splitted: #이제 완벽히 나누어진 것들이 splitted에 들어있다.(+로 splilt한 리스트 별로)
        no_zero=ff.lstrip('0')
        if no_zero != '':
            splitted_formula.append(no_zero) # 앞의 0을 제거하고 리스트에 append
        else:
            splitted_formula.append('0')
# print(splitted_formula) #['55', '50', '40'] #['9', '9']

new_formula=splitted_formula[0] #0이 제거된 새로운 식이 저장될 string
split_num=1 # splitted_formula의 index로 쓰일 int. 첫 번째 숫자는 위에서 사용했으니까 1부터 시작
for f in formula: #식의 첫번쨰 부터 탐색한다.
    if f=='+' or f=='-': # 부호가 있으면
        new_formula+=f #formula에서 부호만 가져오고
        new_formula+=splitted_formula[split_num] # 0을 제거하고 남은 숫자를 가져온다.
        split_num+=1 #그 숫자를 가져왔으니 인덱스를 1 더해준다.

result='' #괄호가 들어간 식이 나올 결과
break2=False #2중 for문을 나오기 위한 break 여부
start=True
for i,f in enumerate(new_formula):

    if f=='-' and start==False : #괄호 닫기
        result += ')'
        result += f 
        start = True
        if i!=len(new_formula)-1: #마지막이 아닐떄는 강제로 열어주기
            result += '('
            start=False

    elif f == '-' and start==True: # - 가 나오면 그때 괄호를 넣는다.
        result += f # - 를 넣는다
        result+='(' # 괄호를 시작
        start=False

    elif i==len(new_formula)-1 and start==False: # 마지막일 때는 강제로 닫아주기
        result += f
        result += ')'

    else:
        result+=f # 괄호 밖의 숫자과 +들
print('result=',result,'=',eval(result))

설명

  • 무조건 -가 나올때 시작하고 다음 -가 나오기 전까지 괄호 유지하기
  • 숫자 앞의 0 삭제
  • 0으로만 이루어진 숫자 삭제하기

알게된 것

  • split
    원래 알고 있었지만 한 번에 2개의 seperator로 나누지는 못한다는 것을 알게되었다.
    그리고 return 값을 받아야지만 그 바뀐 내용이 저장된다.
  • exal(식)
    매번 이런 문제를 풀 때 마다 잊어버린다
    eval안의 문자열을 실행해주는 함수
  • lstrip()
    strip이 문자열 앞 뒤에 띄어쓰기 같은 것을 정리해주는 것은 알고 있었는데, '0'같은 것도 지정해서 없앨 수 있으려나 하고 찾아봤는데 된다!