알고리즘문제

백준1541 잃어버린 괄호 [python]

5witch 2022. 5. 10. 12:13

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

 

출처-백준

입력받은 식에 연산 순서..? 를 정해서 최솟값을 출력해야 하는 문제다.

 

 

입력값이 string이라서 일단  숫자를 다 분리할 생각을 했으나..

 

생각해보니 다 분리해버리면  - 의 위치를 모름..

 

그래서 일단 - 기준으로 먼저 나눠봄

 

입력 예제인 55-50+40 를  .split('-') 하면

['55', '50+40']

이런 식으로 나뉨

 

여기서 55  - (55 + 40) 은  55 - 55 - 40 이니까....

 

처음 55는 결괏값에서 더해주고,  두 번째 요소인 55+40은 첫 결괏값에서 빼주면 되겠구나라고 생각했음

 

(틀린 코드) 코드를 짜 봄

n = input().split('-')

roof = True
result = 0

for i in n:
    j = i.split('+')

    for k in j:
        if roof:
            result+=int(k)

        else:
            result-=int(k)

    roof = not(roof)

print(result)

처음 입력받을 때 '-'를 기준으로 나눠주고

for문을 돌려서  -로 나눠놓은 배열의  각 요소 합을 처음에는 더하고 두 번째 돌 때는 빼줬음

 

"실패"

 

왜 틀렸나..? 0-100+50-100+50-100 넣어보면 알 수 있음  - 연산자가 여러 개 나오는 경우를 생각하지 않음ㅋㅋㅋ


생각해보니... 
(정답 코드 1) 이상태에서 최솟값을  구하려면 그냥 55에서  50+40 더한 걸 빼 주면 됨

n = input().split('-')

result = 0

resultlist = []
for i in n:
    j = i.split('+')
    for k in j:
        result += int(k)
    resultlist.append(result)
    result = 0

result = resultlist[0]

for i in resultlist[1:]:
    result -= i

print(result)

아까와 다르게 - 연산자를 기준으로 나눈 배열 안의 각 요소들을 계산해서 넣어줌

 

예를 들어 0-100+50-100+50-100 면

 

+연산자가 있는 요소들은 계산되어 들어가서

resultlist 배열은 [0, 150, 150, 100] 이 됨


0번째 인덱스를 따로 빼두고 1번째 인덱스부터 for문 돌려서 0번째 인덱스에서 빼줬음

"정답"

 

 

 

 

 

(정답 코드 2) 이해하기 쉽게 코드를 정리해서 다시 작성해봄

def calculateList(list):
    listEliment = []

    for i in list:
        listEliment.append(plusListEliment(i.split('+')))

    return listEliment


def plusListEliment(list):
    plusEliment = 0

    for k in list:
        plusEliment += int(k)

    return plusEliment


def returnResult(list):
    firstEliment = list[0]
    otherEliment = 0

    for i in list[1:]:
        otherEliment -= i

    return firstEliment + otherEliment



n = input().split('-')

print(returnResult(calculateList(n)))