leetcode , 백준
[스택] LeetCode 232번 문제 학습
_HelloWorld_
2025. 5. 8. 10:44

문제 설명
Implement Queue using Stacks는 스택을 써서 큐를 구현하는 문제임. 큐의 연산 push, pop, peek, empty를 지원해야 함. push는 요소를 큐 뒤에 추가, pop은 앞에서 제거하고 리턴, peek은 앞 요소 리턴, empty는 큐가 비었는지 확인. 스택은 후입선출(LIFO)이라 선입선출(FIFO) 큐를 구현하려면 스택 조작이 필요함.
푼 과정
스택 하나로 풀었음. 슬라이스([]int)를 스택처럼 써서 구현. push는 슬라이스 끝에 append로 추가. pop은 첫 요소 꺼내고 슬라이스 잘라서 리턴. peek은 첫 요소 리턴. empty는 슬라이스 길이 체크. 근데 이건 스택이 아니라 그냥 슬라이스 직접 써서 큐 구현한 거라 문제 의도랑 살짝 안 맞음. 문제는 스택(스택 연산만) 써서 큐를 만들어야 함.
그래도 코드 동작은 잘하고 빠르게 풀었음.
알고리즘 분석
슬라이스로 큐 직접 구현했음. push는 append로 O(1) 평균, pop은 슬라이스 첫 요소 제거로 O(n) (내부 복사 때문), peek은 O(1), empty도 O(1). 공간은 슬라이스 하나라 O(n). 문제 의도는 스택 두 개 써서 push/pop을 O(1)로 만드는 거였음. 너 방식은 큐 동작은 맞지만 스택 연산(push/pop)만 썼어야 함. 스택 두 개 방식은 push/pop 중 하나를 O(n), 다른 하나를 O(1)로 만듦.
package main
type MyQueue struct {
x []int
}
func Constructor() MyQueue {
return MyQueue{
x: make([]int, 0),
}
}
func (m *MyQueue) Push(x int) {
m.x = append(m.x, x)
}
func (m *MyQueue) Pop() int {
p_x := m.x[0]
m.x = m.x[1:]
return p_x
}
func (m *MyQueue) Peek() int {
return m.x[0]
}
func (m *MyQueue) Empty() bool {
return len(m.x) == 0
}
func main() {
}