문제 분석
- 돈을 실수로 잘못 부를 때마다 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을 구할 때 이러한 차이를 명확하게 알지 못하고 (공부 부족..) 막 갔다 쓴 결과 저런 실수가 발생했다. 개념을 명확하게 아는 것이 중요하다는 것을 다시 한 번 (한번이 모여 백번은 더 한 것 같지만) 깨닫는다.
'코딩 테스트 > 백준' 카테고리의 다른 글
[Python] 백준 18258 큐 2 (0) | 2024.09.11 |
---|---|
[Python] 백준 12789 도키도키 간식드리미 (0) | 2024.09.10 |
[Python] 백준 4949 균형잡힌 세상 (0) | 2024.09.10 |
[Python] 백준 9012 괄호 (0) | 2024.09.10 |
[Python] 백준 28278 스택 2 (1) | 2024.09.09 |