Description
Code
package main
import (
"bufio"
"os"
"fmt"
)
var (
sc = bufio.NewReader(os.Stdin)
wr = bufio.NewWriter(os.Stdout)
Que []int
)
// 정수 X를 큐에 넣음
func push(x int) {
Que = append(Que, x)
}
// 큐에 가장 앞에 있는 정수를 빼고, 그 수를 출력
func pop() int {
if len(Que) == 0 {
return -1
}
ret := Que[0]
Que = Que[1:]
return ret
}
// 큐의 정수 개수 출력
func size() int {
return len(Que)
}
// 큐의 공백 확인
func empty() int {
if len(Que) == 0 {
return 1
}
return 0
}
// 큐의 가장 앞에 있는 정수를 출력
func front() int {
if len(Que) == 0 {
return -1
}
return Que[0]
}
// 큐의 가장 뒤에 있는 정수를 출력
func back() int {
if len(Que) == 0 {
return -1
}
return Que[len(Que) - 1]
}
func main() {
defer wr.Flush()
var N int
fmt.Fscanln(sc, &N)
// 1 ~ N 까지 큐에 넣음
for i := 1; i <= N; i++ {
push(i)
}
for size() > 1 {
// 가장 앞에 있는 카드를 버림
pop()
// 가장 앞에 있는 카드를 뒤로 보냄
push(pop())
}
fmt.Fprintln(wr, Que[0])
return
}
- 문제 상황:
1부터 N까지 번호가 적힌 카드가 순서대로 큐에 들어감.- 가장 위의 카드를 버림.
- 그다음 위의 카드를 큐의 맨 뒤로 이동.
- 위 과정을 반복하여 카드가 한 장만 남을 때까지 진행함.
- 큐 연산 구현:
- push(x): 큐의 맨 뒤에 정수 x를 추가함.
- pop(): 큐의 맨 앞에 있는 정수를 제거하고 반환함. 큐가 비어 있으면 -1을 반환함.
- size(): 큐에 들어 있는 정수의 개수를 반환함.
- empty(), front(), back(): 각각 큐의 상태와 특정 위치의 정수를 반환함.
- 알고리즘 흐름:
- 1부터 N까지의 숫자를 큐에 차례로 추가.
- 큐에 남은 카드가 한 장이 될 때까지 반복:
- pop()을 호출하여 가장 위의 카드를 버림.
- pop()으로 얻은 가장 위의 카드를 push()하여 큐의 맨 뒤로 이동.
- 큐에 남은 마지막 카드를 출력.
- 결과 출력:
큐에 남은 마지막 카드의 번호를 출력함.