[Python]백준_10773 : 제로

Alal11·2022년 8월 11일
1
post-thumbnail

출처

https://www.acmicpc.net/problem/10773


문제

나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다.

재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다.

재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다.

재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자!


입력

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000)

이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다.

정수가 "0"일 경우에 지울 수 있는 수가 있음을 보장할 수 있다.


출력

재민이가 최종적으로 적어 낸 수의 합을 출력한다. 최종적으로 적어낸 수의 합은 231-1보다 작거나 같은 정수이다.


예제 입출력


힌트

예제 2의 경우를 시뮬레이션 해보면,

[1][1,3]
[1,3,5][1,3,5,4]
[1,3,5] (0을 불렀기 때문에 최근의 수를 지운다)
[1,3] (0을 불렀기 때문에 그 다음 최근의 수를 지운다)
[1,3,7][1,3] (0을 불렀기 때문에 최근의 수를 지운다)
[1] (0을 불렀기 때문에 그 다음 최근의 수를 지운다)
[1,6]
합은 7이다.


➡️문제 분석

정수 k를 입력하고, k개의 정수 num을 입력한다.

num이 0인 경우와 0이 아닌 경우로 나눠서
0이라면 리스트의 최근의 수를 지우고, 아니라면 num을 리스트에 추가한다.

최종적으로 리스트에 있는 수들의 합을 출력한다.


➡️코드(⭕)

stack = []					# 스택 리스트 생성
k = int(input())

for i in range(k):
    num = int(input())
    if num == 0:			# num이 0이면 리스트의 마지막 값 삭제
        stack.pop()
    else:					# 0이 아니라면 num을 리스트에 추가
        stack.append(num)

print(sum(stack))			# 리스트에 있는 수들의 합 출력

➡️코드 분석

  • 빈 리스트 stack을 생성하고, 정수 k를 입력받는다.

  • for문을 이용하여 k번 반복한다.

    • k개의 정수 num을 입력받는다.

    • num이 0이면, pop 함수를 이용해 리스트의 마지막 값을 삭제한다.

    • num이 0이 아니라면, num을 리스트에 추가해준다.

  • stack 리스트에 있는 수들의 합을 출력한다.


✍️stack 개념

:: 가장 나중에 넣은 데이터를 가장 먼저 빼낼 수 있는 데이터 구조로 Last In First Out(LIFO) 방식

파이썬에서는 list [] 로 이미 구현되어 있다.
ex) append 함수, pop 함수 등

✍️pop() 함수~ 마지막 또는 특정 인덱스의 요소를 삭제

  • 리스트.pop() 형태

:: 리스트의 마지막 요소를 삭제한 뒤 삭제한 요소를 반환

>>> a = [10, 20, 30]			# 리스트 a 정의
>>> a.pop()						# 리스트에서 마지막 요소 30 삭제
30								# 삭제한 요소 30 반환
>>> a
[10, 20]						# 리스트 a의 마지막 요소가 삭제됨
  • 리스트.pop(인덱스) 형태

:: 해당 인덱스의 요소를 삭제한 뒤 삭제한 요소를 반환, del 리스트[인덱스]와 같음

>>> a = [10, 20, 30]			# 리스트 a 정의
>>> a.pop(1)					# 인덱스 1의 위치의 요소 값 20을 삭제
20								# 삭제한 요소 20 반환
>>> a
[10, 30]						# 리스트 a의 특정 인덱스의 요소가 삭제됨

+) pop 대신 del을 사용해도 상관없다.

✍️del 키워드

  • del 리스트[인덱스] 형태
>>> a = [10, 20, 30]
>>> del a[1]
>>> a
[10, 30]

💯자세한 설명은 링크 참고
https://dojang.io/mod/page/view.php?id=2281


➡️end

pop 함수에 대해 확실히 알게된 것 같다.
stack이 뭔지 검색하다가 파이썬 자료구조 내용이 막 나오는데 공부엔 끝이 없구나 느꼈다..ㅋㅋ

0개의 댓글