코딩테스트/백준 문제
[파이썬] 백준 10773번 : 제로
김뚱입니다
2025. 4. 8. 06:05
[문제]
[구현]
- 문제 핵심
- 정수 K개가 순서대로 주어지고,
- 숫자가 "0"이면 가장 최근에 적은 수를 지움
- 아닌 경우 스택에 계속 적재
- 마지막에 스택에 남은 수를 모두 더한 값이 정답
- 구현 방법
- 최근에 입력된 수를 제거해야 하므로 "스택(stack)"이 적절하다고 판단
- 숫자가 0일 경우 stack.pop()으로 최근 수 제거
- 숫자가 0이 아니면 stack.append()로 입력값 저장
- 모든 입력이 끝난 뒤 sum(stack)으로 결과 계산
[코드]
# 리스트를 스택처럼 사용해서 풀었음
import sys
input = sys.stdin.readline
K = int(input())
stack = []
for _ in range(K):
num = int(input())
if num == 0:
if stack:
stack.pop()
else:
stack.append(num)
print(sum(stack))
[제출 결과]
[시간복잡도]
for _ in range(K):
num = int(input())
...
print(sum(stack))
- 입력 수 K에 대해 한 번씩만 순회 : O(K)
- append(), pop()은 모두 O(1)
- 마지막에 sum(stack)도 최악의 경우 K개의 숫자를 합산 : O(K)
총 시간복잡도: O(K)
[다른 접근 방법]
- 배열 인덱스 조작
- 구현 복잡해서 안했음
- deque
- 이 문제에서는 단순히 뒤에서만 삽입/삭제하므로 list로 충분함
[회고]
"가장 나중에 적은 수를 지우는 행동" 때문에 자연스럽게 LIFO(Last-In-First-Out) 구조인 스택을 사용했다.