파이썬
[백준] 10773 제로 (Baekjoon Problem 10773: Zero)
Riella
2023. 8. 17. 16:45
728x90
문제 출처
[문제 요약]
입력으로 부르는 돈의 횟수
그 이후에 돈이 얼마인지 주어진다.
다만 실수로 돈을 부르는 경우가 있는데 그 때는 0을 말하면 지울 수 있다.
잘못 부른 돈을 제외한 돈들의 합을 출력으로 프린트 해야한다.
[풀이]
룹(loop)을 하나만 쓰고 풀수 있는 방법을 고안해낸 결과
sum이라는 변수, 그리고 유효한 돈을 관리하는 리스트(list)인 lst를 만들었다.
여기에 지워야할 인덱스(index)를 나타내는 previdx(이전인덱스)라는 변수를 만들었다.
n만큼 룹을 돌면서
숫자가 들어오는 경우:
sum에 input더해줌
lst에도 input더해줌
previdx는 더해진 수를 가리키게 함
0이 들어오는 경우:
sum에 previdx만큼 빼줌
lst에서도 previdx위치에 있는 input을 빼줌
previdx는 더해진 수의 이전 자리를 가리키게 함
[유의할 점]
0이 아닌 input이 들어온 경우, previdx에 i를 assign하면 index out of bound error가 뜬다. 왜냐하면 0때문에 lst의 길이가 i보다 작아지는 경우가 있기 때문
따라서 input이 온 경우는 previdx += 1, 0이 온 경우는 previdx -= 1을 하도록 하자.
[파이썬 3 코드]
# -*- coding: utf-8 -*-
from sys import stdin
if __name__ == "__main__":
n = int(stdin.readline())
sum = 0
lst = []
previdx = -1
for i in range(n):
toadd = int(stdin.readline())
if toadd != 0:
sum += toadd
lst.append(toadd)
previdx += 1
else:
sum -= lst[previdx]
del lst[previdx]
previdx -= 1
print(sum)