본문 바로가기

코딩 테스트/백준

[Python] 백준 10773 제로

 

 

문제 분석

  • 돈을 실수로 잘못 부를 때마다 0을 외친다. → 0을 부르면 빼서 지우고 다시 작성
  • 최종적으로 적힌 모든 수에 대한 합 구하기
  • 0일 경우에 지울 수 있음을 보장 : 아무것도 안 적힌 상태에서 0이 나오지 않는다. (고려할 필요 x)

 

코드 설계

  • k : 이후 몇개의 수를 입력받을지 미리 알려줌 
  • k번 반복하면서
  • (조건) 입력받은 숫자가 0인지 확인
  • 0이 아니면 .push
  • 0이면 -1번째 list 제거 : .pop
  • stack 리스트에 대해 남아있는 값들의 합 구해서 최종 출력

 

정답 코드

1차 - IndexError

import sys
input = sys.stdin.readline

k = int(input())

stack = []
sum = 0

for _ in range(k):
    n = int(input())
    if n : # 0이 아니면
        stack.append(n)
    else : # 0이면
        stack.pop()

for i in stack:
    sum += stack[i]

print(sum)
  • 예제 입력 1에 대해서는 통과했으나, 예제 입력 2에 대해서는 
  •     sum += stack[i]
               ~~~~~^^^
    IndexError: list index out of range
  • 디버깅을 해보니 마지막으로 sum += stack[i]에서 문제 발생
  • i에는 stack의 요소가 순차적으로 대입되는데 예제 입력 2에서는 sum을 구하기 전 stack = [1,6] 이 들어있어 stack 리스트에 0,1 인덱스만 접근할 수 있다. 그런데 stack[6]에 접근하려니 당연히 인덱스 에러가 발생한다. 
  • 따라서 해당 부분 코드를 다음과 같이 수정하면 오류가 해결된다. 아니면 2차 정답처럼 접근을 다르게 하면 된다.
for i in stack:
    sum += i

 

2차 - 정답

import sys
input = sys.stdin.readline

k = int(input())

stack = []
sum = 0

for _ in range(k):
    n = int(input())
    if n : # 0이 아니면
        stack.append(n)
    else : # 0이면
        stack.pop()

for i in range(len(stack)):
    sum += stack[i]

print(sum)

 

** for i in range(len(stack))for i in stack 의 차이

- for i in range(len(stack)) : 이때의 i는 stack 리스트의 인덱스 값이다. 즉 i는 0 ~ len(stack) -1 까지의 값을 순차적으로 가지며, stack[i] 로 리스트의 각 요소에 접근한다. 따라서 stack의 길이만큼 반복하면서 각 인덱스 i는 stack[i]를 통해 각 요소에 접근하여 sum에 더한다.

- for i in stack : 이때의 i는 stack 리스트의 요소 값 자체를 의미한다. 즉, stack 리스트의 각 요소가 순차적으로 i에 대입된다. 따라서 i가 바로 stack 리스트의 각 요소를 나타내고 리스트에 요소들을 sum에 더한다.

두 코드 방식은 논리적으로 동일하다. 그러나 sum을 구할 때 이러한 차이를 명확하게 알지 못하고 (공부 부족..) 막 갔다 쓴 결과 저런 실수가 발생했다. 개념을 명확하게 아는 것이 중요하다는 것을 다시 한 번 (한번이 모여 백번은 더 한 것 같지만) 깨닫는다.