
https://www.acmicpc.net/problem/2164
N장의 카드가 1부터 N까지 순서대로 놓여있다. 아래 과정을 반복하면서 마지막 남은 카드 번호를 출력해야 한다.
제일 위에 있는 카드를 버린다.
그 다음 제일 위에 있는 카드를 맨 아래로 옮긴다.
카드가 한 장 남을 때까지 반복한다.
처음엔 배열로 구현하려고 했는데,
앞에서 제거하고 뒤로 붙이는 작업이 많아서 배열로는 비효율적일 것 같았다.
그래서 Queue를 사용하는 것이 적합하다고 판단했다.
Queue는 선입선출(FIFO) 구조로,
앞에서 꺼내고(Dequeue) 뒤에 넣는(Enqueue) 작업에 매우 적합하다.
| 메서드 | 설명 |
|---|---|
Enqueue(x) | 큐 뒤에 x 추가 |
Dequeue() | 큐 앞에서 값을 꺼내고 제거 |
Peek() | 큐 앞의 값을 꺼내지 않고 확인 |
Count | 큐에 남아있는 요소 개수 |
1부터 N까지 값을 큐에 넣는다.
큐에 카드가 한 장 남을 때까지 다음을 반복한다:
앞의 카드를 버린다 (Dequeue)
다음 카드를 꺼내서 맨 뒤로 보낸다 (Dequeue → Enqueue)
마지막 남은 카드를 출력한다 (Peek)
using System;
using System.Collections.Generic;
namespace backjoon
{
internal class Program
{
static void Main()
{
int n = int.Parse(Console.ReadLine());
Queue<int> queue = new Queue<int>();
// 1부터 n까지 큐에 넣기
for (int i = 1; i <= n; i++)
{
queue.Enqueue(i);
}
// 카드가 한 장 남을 때까지 반복
while (queue.Count > 1)
{
queue.Dequeue(); // 제일 위 카드 버림
int temp = queue.Dequeue(); // 다음 카드 저장
queue.Enqueue(temp); // 맨 뒤로 보냄
}
// 마지막 남은 카드 출력
Console.WriteLine(queue.Peek());
}
}
}
Queue는 특정 순서의 반복적인 처리에 매우 적합한 자료구조였다.
queue.Dequeue()는 값을 꺼내고 제거하며,
int temp = queue.Dequeue();는 꺼낸 값을 저장하고 활용할 수 있다.
문제를 해결할 때 적절한 자료구조를 고르는 것이 핵심이다!