문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
출력
첫째 줄에 정답을 출력한다.
예제 입력 1
55-50+40
예제 출력 1
-35
예제 입력 2
10+20+30+40
예제 출력 2
100
예제 입력 3
00009-00009
예제 출력 3
0
코드
# 55-50+40
numbers = input().split('-') # ['55', '50+40']
sum_list = []
for number in numbers:
total_num = 0
plus_list = number.split('+')
for positive_num in plus_list:
total_num += int(positive_num)
sum_list.append(total_num) # [55, 90]
result_num = sum_list[0]
for i in range(1, len(sum_list)):
result_num -= sum_list[i]
print(result_num)
코드 풀이
- split('-') - 를 기준으로 string input을 파싱함
- 해당 문제의 핵심은 - 가 나오면 다음에 - 가 나올 때까지 값을 더하고 마지막에 값을 빼는 것이다.
- 따라서 split 함수를 사용하여 - 를 기준으로 문자열을 분리하고 list를 반환한다.
- split('+') +를 기준으로 +값을 더해주고 list에 담아준다.
- 첫번째를 요소를 제외하고 모든 수를 빼주어 최솟값을 출력한다.
핵심 포인트
- - 를 기준으로 식을 파싱하기 위해 split('-') 을 사용한다.
- - 와 - 사이에 모든 수를 더해주기 위해 for문을 사용하고 split('+') 을 사용한다.
- 문제에서 "가장 처음과 마지막 문자는 숫자이다." 라는 점에서 ‘-10-20+30-30+40’ 은 불가능하다.
- 따라서 무조건 첫번째는 양수이므로 이 값에 나머지 값을 모두 빼준다.
- 괄호는 한 개가 아닌 적절히(마음껏) 칠 수 있다.
- 실제로 식에 괄호 치는 문제가 아니다. 출력을 보고 해당 결과값을 도출할 수 있도록 프로그래밍하면 된다.
'백준 코딩테스트 > 그리디(Greedy)' 카테고리의 다른 글
11399번: ATM (7 / 30) - 실버 4 (0) | 2024.10.07 |
---|---|
2839번: 설탕 배달 (7 / 29) - 실버 4 (0) | 2024.10.07 |
1931번: 회의실 배정(8 / 2) - 실버 1 (1) | 2024.10.07 |
11000번: 강의실 배정 (8 / 3) - 골드 5 (0) | 2024.10.07 |
1744번: 수 묶기 (8 / 4) - 골드 4 (1) | 2024.10.07 |