Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- application.yml
- Runwith
- diary
- 테스트
- extendwith
- 파이썬
- 데이터 직렬화
- playgroundAI
- git 오류
- notempty
- 백준
- 부하 테스트
- 소스코드품질
- 데이터 거버넌스
- Live Template
- 코딩테스트
- 알고리즘
- 스택
- 영어일기
- LRS
- xapi
- AI그림
- JUnit
- useRef
- serializtion
- 연계방식
- JUnit5
- 일기
- git
- 정적분석도구
Archives
- Today
- Total
HanSol's Oak Cask
백준 10828번: 스택 (Python) 본문
🔹 문제 설명
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성한다.
명령어는 총 5가지이다.
- push X: 정수 X를 스택에 넣는다.
- pop: 스택에서 가장 위에 있는 정수를 제거하고 출력한다. 스택이 비어있으면 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 스택이 비어있으면 -1을 출력한다.
🔹 내가 처음 작성한 코드
import sys
n = int(sys.stdin.readline())
stack = []
for _ in range(n):
command = sys.stdin.readline()
# push
if "push" in command:
stack.append(int(command.split()[1]))
# pop
if command == "pop":
if len(stack) == 0:
print(-1)
else:
print(stack.pop())
# size
if command == "size":
print(len(stack))
# empty
if command == "empty":
if len(stack) == 0:
print(1)
else:
print(-1) # ❌ 잘못된 출력
# top
if command == "top":
if len(stack) == 0:
print(-1)
else:
print(stack[-1])
🔹 틀린 이유 분석
- 개행 문자(\n) 제거 필요
- sys.stdin.readline()을 사용하면 입력값 끝에 개행 문자(\n)가 포함된다.
- 따라서 "pop"을 입력하면 command = "pop\n"이 되어 if command == "pop":이 False가 된다.
- ✅ 해결 방법: .strip()을 사용하여 개행 문자 제거.
- "push" in command 조건이 불명확
- "pushpop" 같은 이상한 입력이 들어오면 push로 인식할 가능성이 있음.
- ✅ 해결 방법: command.startswith("push") 사용.
- empty 명령어에서 출력값 오류
- 스택이 비어있으면 1, 비어있지 않으면 0을 출력해야 한다.
- ✅ 해결 방법: else: print(0)으로 수정.
- if command == "empty": if len(stack) == 0: print(1) else: print(-1) # ❌ 정답은 0이어야 함
- if-else 구조 최적화 가능
- print(stack.pop() if stack else -1)처럼 간결한 표현이 가능.
🔹 올바르게 수정된 코드
import sys
n = int(sys.stdin.readline().strip()) # 개행 문자 제거
stack = []
for _ in range(n):
command = sys.stdin.readline().strip() # 개행 문자 제거
# push X
if command.startswith("push"):
stack.append(int(command.split()[1]))
# pop
elif command == "pop":
print(stack.pop() if stack else -1)
# size
elif command == "size":
print(len(stack))
# empty
elif command == "empty":
print(1 if not stack else 0) # 0으로 수정
# top
elif command == "top":
print(stack[-1] if stack else -1)
🔹 수정된 코드의 개선점
문제점 기존 코드 수정된 코드
| 개행 문자 제거 필요 | command = sys.stdin.readline() | command = sys.stdin.readline().strip() |
| "push" in command 문제 | "push" in command (불명확) | command.startswith("push") (정확한 비교) |
| empty 출력 오류 | print(-1) | print(0) |
| 불필요한 if-else 구조 | if len(stack) == 0: print(-1) else: print(stack[-1]) | print(stack[-1] if stack else -1) (더 간결함) |
🔹 결론
✔ .strip()을 사용하여 개행 문자 제거
✔ startswith("push")를 사용하여 명확한 명령어 판별
✔ empty 명령에서 올바른 값(0, 1) 출력하도록 수정
✔ if-else 대신 삼항 연산자로 코드 간결화 🚀🔥
'알고리즘, 코딩테스트' 카테고리의 다른 글
| 백준 9012번: 괄호 (Python) (1) | 2025.02.18 |
|---|---|
| 백준 9093번: 단어 뒤집기 (Python) (0) | 2025.02.18 |
| 백준 2839번: 설탕 배달 문제 해결 과정 (Python) (0) | 2025.02.14 |
| 특정 요소가 다른 모든 요소의 합보다 큰 지 판별하는 방법 (0) | 2025.02.12 |
| 백준 3009번: 네 번쨰 점, 파이썬 XOR연산 (0) | 2025.02.12 |