본문 바로가기
Algorithm

[수학/그리디] 백준 1541 잃어버린 괄호 - Python

by jangThang 2022. 2. 3.
반응형

백준 온라인 저지

 

[ Contents ]

     

     

    1. 문제 (링크 참조)

     

    1541번: 잃어버린 괄호

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

    www.acmicpc.net

     

     

     

    2. 문제 풀이

     -와 +로 이루어진 식에 임의로 결합법칙을 적용해 최소값을 만드는 문제입니다.

     

    2022.01.19 - [Algorithm] - [Algorithm] 단골 1번 문제, 구현 / 수학

     

    [Algorithm] 단골 1번 문제, 구현 / 수학

    [ Contents ] 1. 구현  단순히 '구현'만 하면 되는 문제 유형입니다. 문제를 이해하고 입력에 맞춰 적절한 출력만 하면 됩니다. 특별한 알고리즘이나 프로그래밍적 기법 없이, 단순 제어문만 사용하

    star7sss.tistory.com

     어렵게 생각하면 어렵고, 쉽게 생각하면 쉬운 문제입니다. 일단, 최소값이 나오기 위해서는 음수가 최대한 많이 나와야 합니다. 따라서 최대한 길게 음수식을 만들어 줍니다.

     여기서 음수식은 - (a + b + ... + z) 인 형태를 뜻합니다.

     

    3+2-2+3+2+1-0+2+3-2-1+2

     위와 같은 식을 변환하면 아래와 같습니다.

     

    3+2-(2+3+2+1)-(0+2+3)-(2)-(1+2) = 5 - 8 - 5 - 2 -3 = -13

     

     

     

    3. 코드

    import sys
    input = sys.stdin.readline
    
    term = list(input().rstrip())
    res = 0
    num = ''
    minus = False
    
    # minus가 1번만 나와도, 그 다음부터는 음수
    for i in term:
        # minus가 한 번도 안 나왔을 때
        if not minus:
            if i == '-':
                minus = True
                res += int(num)
                num = ''
            elif i == '+':
                res += int(num)
                num = ''
            else:
                num += i

     위 음수식을 잘 이해하면, -(음수 부호)가 1번만 나오면 그 뒤는 모두 음수가 됨을 알 수 있습니다.

     -가 한 번도 나오지 않았을 때에는 +로 숫자를 더해줍니다.

     

     

        # minus가 한 번 이상 나왔을 경우
        elif minus:
            if i == '-' or i == '+':
                res -= int(num)
                num = ''
            else:
                num += i

     -가 한 번이라도 나온 뒤에는, 숫자를 빼줍니다.

     

     

    if minus:
        res -= int(num)
    else:
        res += int(num)
    print(res)

     위 반복문에서는 - 혹은 +부호가 나와야 num을 연산했습니다. 맨 끝의 숫자는 -, +가 뒤에 붙지 않으므로 따로 더하거나 빼줍니다.

     

     

    <전체 코드>

    import sys
    input = sys.stdin.readline
    
    term = list(input().rstrip())
    res = 0
    num = ''
    minus = False
    
    # minus가 1번만 나와도, 그 다음부터는 음수
    for i in term:
        # minus가 한 번도 안 나왔을 때
        if not minus:
            if i == '-':
                minus = True
                res += int(num)
                num = ''
            elif i == '+':
                res += int(num)
                num = ''
            else:
                num += i
    
        # minus가 한 번 이상 나왔을 경우
        elif minus:
            if i == '-' or i == '+':
                res -= int(num)
                num = ''
            else:
                num += i
    
    if minus:
        res -= int(num)
    else:
        res += int(num)
    print(res)

     

     

    반응형

    댓글