[Python] Baekjoon 백준 1541번 잃어버린 괄호
[Python] Baekjoon 백준 1541번 잃어버린 괄호
문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
출력
첫째 줄에 정답을 출력한다.
n = input()
num = []
tmp = 0
pm = '+'
s = 0
for i in range(len(n)):
if n[i] == '+' or n[i] == '-':
num.append(int(n[s:i]))
s = i
if i == len(n) -1:
num.append(int(n[s:]))
for i in num:
if i > 0 and pm == '+':
tmp += i
else:
pm = '-'
tmp -= abs(i)
print(tmp)
이 문제의 핵심은 '-' 기호를 만나는 순간부터 끝까지 다 합해서 '-' 기호 앞의 수 합을 빼면 된다
처음에는 '-' 기호 뒤부터 다음번 '-' 기호 까지 를 모두 합해서 빼고 어쩌고 하려고 삽질을 하다가
결국엔 그냥 '-' 만나면 그 뒤로는 싹다 합해버리게 하니까 해결되었다
for i in range(len(n)):
if n[i] == '+' or n[i] == '-':
num.append(int(n[s:i]))
s = i
if i == len(n) -1:
num.append(int(n[s:]))
입력받은 문자열을 계산하기 쉽도록 '+' 또는 '-' 를 만나면 그 앞까지 int 로 변환해서 리스트에 저장하는방식이다
저장했으면 s 라는 시작지점 변수에 현재 '+' 또는 '-' 의 위치인 i 값을 넣어주어서
다음번 실행되었을때 앞에 수들이 중복되지 않게 한다
마지막에는 기호가 없을테니 i 가 문자열 길이의 끝이면 s 부터 끝까지 슬라이싱 해서 넣어준다
이렇게 하면 예를들어 '55-50+40' 의 입력값이 들어갔다면
num 리스트에는 55, -50, 40 이렇게 들어간다
for i in num:
if i > 0 and pm == '+':
tmp += i
else:
pm = '-'
tmp -= abs(i)
리스트에서 하나씩 꺼내서 tmp라는 변수에 더해준다
하지만 i 가 0보다 크고 현재 pm 상태가 '+' 가 아니라면 i 가 0보다 작은수 즉 '-' 를 만났다는 결과이기에
else 문에서 pm 을 '-'로 변경해주어 위에 if문이 실행되지 않게 하고,
그냥 리스트 끝까지 '+' , '-' 상관없이 abs() 해주어 tmp에 더해준다
다른분 풀이
n = input().split('-')
tmp = 0
for i in n[0].split('+'):
tmp += int(i)
for i in n[1:]:
for j in i.split('+'):
tmp -= int(j)
print(tmp)
검색하여 쉬워보이는 답안을 찾았다 split()을 이용하여 좀더 쉽게 풀으신것같다
n = input().split('-')
입력 받을때 '-' 로 구분지어 리스트에 저장
이렇게하면 첫 '-' 가 나올때까지는 n[0] 에는 '+' 인것들만 모일것이고
n[1] 부터는 '-' 가 한번 나온 후의 숫자들이 모이게되는데 '-' 가 더 있을수있으니 리스트의 길이를 가늠할 수 없다
for i in n[0].split('+'):
tmp += int(i)
먼저 '-' 나오기 앞의 숫자들을 전부 더해주는 반복문
split() 으로 잘라서 하나씩 불러오는것은 생각도 못해봤다
위에서 '-' 기호는 다 사라졌을테니 '+' 로 나누어서 숫자들만 합 해준다
for i in n[1:]:
for j in i.split('+'):
tmp -= int(j)
이번엔 '-' 기호 다음 수 들 이다
n[1: ] 로 1번 인덱스부터 끝까지 하나씩 불러서
i.split('+') 으로 '+' 구분자로 잘라서 하나씩 불러서 전부다 빼준다
전혀 생각하지도 못했던 방식이다.... ㅠㅠ