Algorithm/Baekjoon

[Python] Baekjoon 백준 1541번 잃어버린 괄호

Lute3r 2021. 9. 28. 22:47

[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('+') 으로 '+' 구분자로 잘라서 하나씩 불러서 전부다 빼준다

 

전혀 생각하지도 못했던 방식이다.... ㅠㅠ

 

반응형