[백준] 1541 - 잃어버린 괄호 (Python, 숏코딩 2가지)

반응형

BAEKJOON's Logo

Contents

    * 일반 풀이와 숏코딩 풀이 2개

    ## 일반 풀이
    sik_minus = input().split('-') # 55-50+40 => [55, 50+40]
    sik_plus = [] #[55, 90]
    
    for i in sik_minus: 
        count = 0 
        i = i.split('+') #[55], [50,40]
        for j in i:
            count += int(j) # 1. 55    2. 50+40 
        sik_plus.append(count) 
    
    result = sik_plus[0]
    for i in range(1, len(sik_plus)):
        result -= sik_plus[i]
    
    print(result) # -35
    ##숏코딩1
    sik_minus = input().split('-')
    sik_plus = list(map(lambda x: sum(map(int,x.split('+'))),sik_minus))
    print(sik_plus[0]-sum(sik_plus[1:]))
    
    ##숏코딩2
    f,*o=[sum(map(int,t.split('+'))) for t in input().split('-')]
    print(f-sum(o))

     

    문제 정의

    첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않는다. 수는 0으로 시작할 수 있다. 괄호를 적절히 쳐서 이 식의 값을 최소로 하여 출력하시오.

    예제 입력 및 출력

    예제 입력 및 출력

     

     

    일반 풀이와 숏코딩 풀이

    핵심 알고리즘

    +와 -로 이루어진 연산에서, 결과를 최소로 만들기 위해선, - 를 split 해서 그 안의 모든 수를 + 연산한 뒤, - 연산하면 됩니다. 왜냐하면, -를 기준으로 그 사이 값들은 모두 +연산으로 되어있을 것이고, 그것들을 모두 더하면 (숫자들의 합)-(숫자들의 합)-(숫자들의 합) 꼴이 되어, - 이후의 숫자들이 모두 최대가 되면서 가장 작은 수가 될 것이기 때문입니다.

     

    일반 풀이

    sik_minus = input().split('-') # 55-50+40 => [55, 50+40]
    sik_plus = [] #[55, 90]
    
    for i in sik_minus: 
        count = 0 
        i = i.split('+') #[55], [50,40]
        for j in i:
            count += int(j) # 1. 55    2. 50+40 
        sik_plus.append(count) 
    
    result = sik_plus[0]
    for i in range(1, len(sik_plus)):
        result -= sik_plus[i]
    
    print(result)

    sik_minus변수에 '-'로 split하여 문자열 리스트를 넣습니다. 이것을 for문으로 반복하며, +로 나누어 +해서 sik_plus에 넣습니다. sik_plus에는 '-'를 기준으로 모두 더해진 숫자들이 있을 것입니다. sik_plus에서 처음 수를 result에 넣고, for문을 돌아 처음 수부터 쭉 - 연산을 하면, 최솟값이 나오게 됩니다.

     

    숏코딩1

    sik_minus = input().split('-')
    sik_plus = list(map(lambda x: sum(map(int,x.split('+'))),sik_minus))
    print(sik_plus[0]-sum(sik_plus[1:]))

    위와 마찬가지로 sik_minus에 주어진 식을 '-'로 split 한 값을 넣습니다. lambda 함수 lambda x: sum(map(int,x.split('+'))) 를 sik_minus에 map함수를 통해 적용시킵니다. lambda 함수의 역할은 sik_minux의 각 인자들(숫자+숫자..+숫자 꼴)에 대해 모두 더하는(sum)것입니다. 그 결과를 list로 만들어 sik_plus에 넣습니다. sik_plus에서 첫 인자 - 나머지 인자의 합을 하면, 첫 인자부터 쭉 모든 인자를 뺀 것과 같은 결과가 나옵니다.

     

    숏코딩2

    f,*o=[sum(map(int,t.split('+'))) for t in input().split('-')]
    print(f-sum(o))

    위의 숏코딩1 을 매우 간략화한 것입니다. 리스트컴프리헨션으로 input().split('-')한 것을 반복하며 각 요소에 대해 '+'로 split 하여 모두 더해줍니다. f, *o = 리스트 꼴의 의미는 리스트에서 첫 인자는 f에 들어가고, 나머지 리스트가 o에 들어가는 것입니다. 이때의 '*'은 python의 unpacking 역할을 수행한다고 합니다. f는 위 숏코딩1에서 sik_plus의 첫 번째 인자와 같고, sum(o)는 sum(sik_plus[1:])와 같습니다.

     

    읽어주셔서 감사합니다.

    오늘도 재밌고 유익하길 바랍니다.

    다음에 더 유익하고 재미있는 포스팅으로 찾아오겠습니다.

    https://github.com/netsus/BaekJoon/blob/master/1541.py

     

    GitHub - netsus/BaekJoon: Algorithm Problem solving

    Algorithm Problem solving. Contribute to netsus/BaekJoon development by creating an account on GitHub.

    github.com

     

    반응형

    댓글

    Designed by JB FACTORY