[백준] 1541 - 잃어버린 괄호 (Python, 숏코딩 2가지)
- Programming/알고리즘
- 2022. 4. 24.
* 일반 풀이와 숏코딩 풀이 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
'Programming > 알고리즘' 카테고리의 다른 글
[백준] 2606 바이러스 - Python (그래프 탐색) (7) | 2022.07.17 |
---|---|
[백준] 14248 점프 점프 - Python (그래프 탐색) (0) | 2022.07.16 |
[백준] 9012 - 괄호 (Python, 숏코딩 포함) (0) | 2022.04.19 |
[백준] 1003 - 피보나치 함수 (Python, 숏코딩 포함) (1) | 2022.04.18 |
[백준] 1343 - 폴리오미노 (Python, 숏코딩 포함) (0) | 2022.04.13 |