문제 링크
https://www.acmicpc.net/problem/1541
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
풀이
- 그리디 문제
- + 연산을 먼저 해준 다음에 - 연산을 해주면 값을 최소로 만들 수 있다.
- 큐를 사용하여 풀이
- data 는 등장하는 숫자 저장
- c는 등장하는 연산자 저장
1. 입력받은 문자열 s에 대하여 숫자면 num = '' 에 덧붙이고, 연산자면 c에 저장한다.
연산자가 등장했다는 것은 그 전에 등장한 숫자가 num에 기록되어있을 것이므로 int(num)을 data에 저장하고
num = ""으로 다시 초기화
2. for문이 끝나면 마지막 숫자가 num에 기록되어있으므로 int(num)을 data에 저장
3. 큐에 첫 숫자를 삽입시켜놓고 index 를 증가 시켜가며
+ 일 경우 큐에 젤 최근에 삽입된 숫자를 빼고 다음 숫자를 더한 값을 큐에 삽입
- 일 경우 큐에 다음 숫자 삽입
4. 큐에는 더하기 연산을 다 하고 마이너스 연산을 할 숫자들만 저장되어 있다.
따라서 q에서 하나씩 빼면서 마이너스 연산 실행
from collections import deque
s = input()
# 등장하는 숫자 저장
data =[]
# 등장하는 연산자 저장
c = []
num =""
# 숫자와 연산자 분리해서 저장
for i in range(len(s)):
if s[i].isdigit():
num += s[i]
else:
data.append(int(num))
c.append(s[i])
num = ""
#마지막 숫자 저장
data.append(int(num))
q = deque()
q.append(data[0])
index = 0
while index < len(data)-1 :
# 더하기 연산이면 더한 값 큐에 삽입
if c[index] == '+':
x = q.pop()
q.append(x+data[index+1])
# 빼기 연산이면 그냥 큐에 삽입
else:
q.append(data[index+1])
index += 1
answer = q.popleft()
# 빼기 연산 실행
while q:
answer -= q.popleft()
print(answer)
- 다른 사람 풀이를 참고 하니 아래와 같이 간결하게 풀 수 있었다.
n = input().split('-')
result = 0
print(n)
for i in n[0].split('+'):
result += int(i)
for i in n[1:]:
for j in i.split('+'):
result -= int(j)
print(result)
'개발 > algorithm' 카테고리의 다른 글
[백준 11724번] 연결 요소의 개수 - python (0) | 2022.02.15 |
---|---|
[백준 11279번] 최대 힙 - python (0) | 2022.02.15 |
[백준 1927번] 최소 힙 -python (0) | 2022.02.15 |
[백준 11727번] 2 x n 타일링 2 - python (0) | 2022.02.14 |
[백준 11726번] 2 x n 타일링 - python (0) | 2022.02.14 |