알고리즘/백준
[백준] 1541번 파이썬 _ 잃어버린 괄호
이숭간
2021. 3. 17. 18:35
728x90
문제유형 : 수학, 그리디, 문자열
문제풀이 : 괄호를 적절히 넣어 최솟값을 만드는 방법이므로
- - 를 만나면 앞에 괄호를 넣는다.
- 언제 괄호를 닫아주는가?
- 그다음 - 를 만나면 괄호를 닫고 다시 괄호를 열여준다.
- +일때는 계속 지나간다.
- 만약 배열이 모두 끝났는데 아직 괄호가 열려있는 상태라면 맨 마지막에 괄호를 추가하여 닫아준다.
- 괄호가 열려있냐 닫혀있냐의 여부는 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)