문제. 백준 1541번 잃어버린 괄호
문제 설명
세준이는 양수와 +, -, 그리고 괄호를 가지고 길이가 최대 50인 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다.
출력
첫째 줄에 정답을 출력한다.
출처 : 백준 1541번 잃어버린 괄호
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
나의 풀이 in Python3
#1 (런타임 에러 - 실패)
import re
expression = re.split('-',input())
answer = [str(eval(i)) for i in expression]
print(eval('-'.join(answer)))
문제는 간단했습니다.
최소로 만들기 위해서는 -가 나올 때마다 split해주고 +가 있는 부분은 합을 해줍니다. 마지막으로 -로 split한 리스트를 합쳐서 -해주면 최솟값이 나옵니다.
그래서 저는 string으로 이루어진 수식을 int처럼 수식해주는 eval() 함수를 사용해보았는데 런타임 에러가 계속 떠서 실패하였습니다. 너무 궁금해서 이유를 찾던 중 문제의 입력사항에 숫자 값이 0으로 시작할 수도 있다는 것을 보고 input에 '07-40+40' 이런 식으로 예제를 만들어서 넣어봤습니다. 'invalid token'이라는 경고와 함께 런타임 에러가 뜨는 것을 보고 eval() 함수는 0으로 시작하는 값을 인식을 못한다는 사실을 알아냈고 다른 방식으로 풀어보았습니다.
#2 (성공)
#[BOJ] 1541. 잃어버린 괄호
import re
expression = re.split('-',input())
the_plus = []
for i in expression:
if '+' in i:
plus = list(map(int,i.split('+')))
the_plus.append(sum(plus))
else:
the_plus.append(int(i))
answer = the_plus[0]
for i in the_plus[1:]:
answer -= i
print(answer)
제가 할 수 있는 선에서 최대한 간결하게 만들어보았습니다.
먼저, the_plus라는 리스트에 '+' 수식이 있을 경우 해당 값을 계산해주고 없을 경우 int로 만들어주어 넣어줬습니다.
그리고 -로 input을 했기에 첫 번째 순서부터 차례대로 -해줌으로써 값을 만들었습니다.
int()를 해줄 경우, 0으로 값이 시작하여도 자동으로 0이 제거된 int값이 나오므로 앞서 에러난 부분이 고쳐짐을 알 수 있었습니다.
간단하고 편리한 함수라도 치명적인 에러가 나올 수 있기에 조심해서 써야 한다는 점을 배울 수 있었습니다.
알고리즘 풀이
- 최소값을 얻기 위해서는 - 수식 바로 앞에서 다른 -가 나올 때까지 괄호화 : '-' split
- 괄호 안 '+' 수식을 위해 the_plus 리스트에 '+' 수식 적용된 값 합산
- answer에 괄호 안 '+'수식이 완성된 값을 순서대로 '-' 수식 적용하여 최소값 산출
'Tests > 백준' 카테고리의 다른 글
[BOJ] 백준 2293번 동적계획법 동전 1 (0) | 2021.04.25 |
---|---|
[BOJ] 파이썬 백준 2504번 괄호의 값 (0) | 2021.04.15 |
[BOJ] 백준 1966번 프린터 큐 (0) | 2021.04.07 |
[BOJ] 백준 9021번 괄호 (스택) (0) | 2021.04.05 |
[BOJ] 백준 파이썬 > 14888번 연산자 끼워넣기 (0) | 2020.09.28 |
댓글