본문 바로가기

알고리즘

[자료구조:스택] 백준 10773번 제로

728x90
반응형

문제 요약

재민이는 재현이가 부르는 숫자를 받아 적는다.

재현이가 숫자를 잘못 부를 경우 0을 외쳐 가장 최근에 재민이가 받아 쓴 수를 지우게 한다.

모든 수를 받아 적은 후, 그 수의 합을 출력하는 프로그램을 작성하라. 

백준 10773번 문제 바로가기

입력

첫 번째 줄에 정수 K (1 <= K <= 100,000) 입력

이후 K개의 줄에 정수 1개씩 입력

(정수는 0이상 1,000,000 이하의 값. 0일 경우 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 입력)

정수가 0일 경우 지울 수 있는 수가 있음을 보장

출력

최종적으로 적어 낸 수의 합 출력

합은 2^31-1보다 작거나 같은 정수

입출력 예시

입력 출력
4
3
0
4
0
0
10
1
3
5
4
0
0
7
0
0
6
7

코드

약 20분 소요

처음으로 PyPy3 속도가 빠르다는걸 체감하는 결과. 확실히 메모리는 많이 잡아먹지만 속도 차이가 심하다.

N = int(input())
S = []
result = []
for _ in range(N):
    S.append(int(input()))
for i in S:
    if i == 0 and len(S) != 0:
        result.pop()
    elif i != 0:
        result.append(i)
print(sum(result))

피드백

문제는 쉬웠는데, sys.stdin.readline() 사용해서 입력 받으려다가 10분~15분 가량 소요했다.

그냥 int(input())으로 입력 받음

문제는 list 안에 숫자만 저장하고 싶었는데, 2차원 list로 저장이 되는 것이었다.

항상 readline()으로 int를 입력받으려고 할 때 좀 헤매는 것 같다. 정리해둬야지.

다른 사람 풀이 참고

import sys

N = int(sys.stdin.readline().rstrip())
_list = []
for i in range(N):
    tmp = int(sys.stdin.readline().rstrip())
    if tmp == 0:
        _list.pop()
    else:
        _list.append(tmp)

print(sum(_list))
  • 입력과 동시에 0인지 아닌지 판별해서 pop, push 하도록 구현
  • 굳이 list를 두 번 쓸 필요 X
728x90
반응형