백준 코딩테스트/그리디(Greedy)

1541번: 잃어버린 괄호(8 / 2) - 실버 2

monkeykim 2024. 10. 7. 00:31

문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

입력

첫째 줄에 식이 주어진다. 식은 ‘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)
	

코드 풀이

  1. split('-') - 를 기준으로 string input을 파싱함
    • 해당 문제의 핵심은 - 가 나오면 다음에 - 가 나올 때까지 값을 더하고 마지막에 값을 빼는 것이다.
    • 따라서 split 함수를 사용하여 - 를 기준으로 문자열을 분리하고 list를 반환한다.
  2. split('+') +를 기준으로 +값을 더해주고 list에 담아준다.
  3. 첫번째를 요소를 제외하고 모든 수를 빼주어 최솟값을 출력한다.

핵심 포인트

  1. - 를 기준으로 식을 파싱하기 위해 split('-') 을 사용한다.
  2. -- 사이에 모든 수를 더해주기 위해 for문을 사용하고 split('+') 을 사용한다.
  3. 문제에서 "가장 처음과 마지막 문자는 숫자이다." 라는 점에서 ‘-10-20+30-30+40’ 은 불가능하다.
    • 따라서 무조건 첫번째는 양수이므로 이 값에 나머지 값을 모두 빼준다.
    • 괄호는 한 개가 아닌 적절히(마음껏) 칠 수 있다.
  4. 실제로 식에 괄호 치는 문제가 아니다. 출력을 보고 해당 결과값을 도출할 수 있도록 프로그래밍하면 된다.