[시작]
참여 기간 : 2025/03/31 ~ 2025/04/28
참여 난이도 : 파이썬 / 비기너
⏳ 코테 스터디 진행도 🧱 : [▰▰▰▰▰▰▰▰░ ] 5/29일 (17%)
본 글에서 다룬 문제 : leetcode(Implement Stack using Queues)
문제 푸는 데 걸린 시간 : 28분 37초
[오늘의 문제]
어제 풀었던 문제의 반대
이번에는 큐를 이용해서 스택을 구현하는 듯
[문제 분석]
내가 볼 때 큐로 스택을 구현하는 방법은 크게 2가지다.
큐 2개를 사용하거나 큐 1개로만 구현하거나
일단 1개로만 구현을 해보고 시간복잡도나 코드 가독성 이런 게 생각보다 별로라면
2개로 구현해보는걸로 결정했다.
[의사 코드]
x를 새로 넣을 때(push) 한번 큐에 넣은 뒤에
기존에 있던 애들을 앞에서 빼서 뒤로 붙이는 과정을 반복하면
새로 들어온 x가 맨앞에 오게 됨
그러면 큐의 front가 곧 스택의 top이 된다
이러면 회전으로 큐만 써서 스택을 구현가능하다.
[의사 코드를 실제 코드로 구현]
from collections import deque
class MyStack:
def __init__(self):
self.queue = deque()
def push(self, x: int) -> None:
self.queue.append(x)
for i in range(len(self.queue) - 1):
front = self.queue[0]
self.queue.popleft()
self.queue.append(front)
def pop(self) -> int:
return self.queue.popleft()
def top(self) -> int:
return self.queue[0]
def empty(self) -> bool:
return len(self.queue) == 0
# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()
★ 코드 설명 ★
일단 양쪽에서 빠르게 삽입/삭제가 가능한 큐인 deque을 사용했고
의사 코드에서도 말했다시피
x를 큐의 뒤에 추가한 뒤에
큐에 들어있던 친구들을 앞에서 빼서 다시 뒤에 붙이는 작업을 반복함
이걸 반복하면 x가 맨 앞에 오게 됨
큐의 맨 앞 = 스택의 탑
스택의 pop()은 가장 최근에 넣은 x을 꺼내야 하니까
큐의 맨 앞에서 popleft() (이미 push시 회전으로 맨 앞에 와있음)
그리고 스택의 top은 가장 위에 있으니까 self.queue[0]로 확인가능함
empty(self)부분은 큐가 비어있으면 스택도 비어있으니 True
하나라도 있으면 False
말로 길게 쓰니까 두서가 없는데 요약하면 다음과 같음
메서드 | 동작은 어떻게? | 큐에서 어떻게 처리? |
push(x) | x를 스택 위에 넣음 | 뒤에 넣고 앞쪽을 돌려서 x가 맨 앞에 오도록 회전 |
pop() | 스택 위에서 제거 | 큐 맨 앞 꺼냄 |
top() | 스택 위를 확인 | 큐 맨 앞 확인 |
empty() | 비었는지 확인 | 큐의 길이가 0인지 확인 |
[제출 결과]
[실수한 부분]
- 회전 과정에서 횟수 계산 실수
- x를 맨 앞 위치로 가져오기 위해서 (현재 큐 크기 - 1) 회만큼 회전해야 하는데 계산 실수로 맨 앞에 오지 않음
- LIFO 순서가 어긋나서 최종 결과가 잘못됨
- pop()에서 회전을 또 시켰음
- LIFO 순서가 또 깨짐
- 나는 큐 하나만 사용해서 원래 큐의 맨 앞을 그냥 popleft() 하는 것만으로 충분했는데 추가 회전을 시켜버림
- 의도치 않은 다른 결과가 나왔음
[마무리]
수면 부족인 상태로 문제 풀려고 하니까 숟가락으로 땅 파는 느낌이었다...
싱싱한 머리로 문제를 풀 수 있는 컨디션을 유지하자
'스파르타 코딩클럽 > 99클럽 코딩테스트 스터디 6기' 카테고리의 다른 글
99클럽 코테 스터디 7일차 TIL [04/08] (0) | 2025.04.08 |
---|---|
99클럽 코테 스터디 6일차 TIL [04/07] (0) | 2025.04.07 |
99클럽 코테 스터디 4일차 TIL [04/03] (0) | 2025.04.03 |
99클럽 코테 스터디 3일차 TIL [04/02] (1) | 2025.04.03 |
99클럽 코테 스터디 2일차 TIL [04/01] (0) | 2025.04.01 |