문제
1부터 N까지 번호가 적힌 카드가 위에서 아래로 순서대로 놓여 있다. 제일 위 카드를 버리고, 그 다음 카드를 제일 아래로 옮기는 동작을 반복할 때, 버리는 순서대로 카드를 출력하라.
입력
첫째 줄에 정수 N (1 이상 1,000 이하)이 주어진다.
출력
버리는 카드들을 순서대로 출력하고, 마지막에 남는 카드도 출력한다 (공백 구분).
예제
| 입력 | 출력 |
|---|---|
4 | 1 3 2 4 |
풀이
큐로 카드 더미를 구현하여 버리기/이동 동작을 시뮬레이션한다.
- 1부터 N까지를 큐에 순서대로 넣는다
- 카드가 2장 이상일 때: 맨 앞 카드를 버리고(poll → 출력), 다음 맨 앞 카드를 맨 뒤로 보낸다(poll → offer)
- 마지막 남은 한 장을 출력한다
핵심 아이디어: BOJ 2164(카드2)와 동일한 동작이지만, 버리는 카드도 모두 출력해야 한다는 점이 다르다.
코드
package com.ssafy.an.day049;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Day24BOJ2161카드1 { // 2161 카드1
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
Queue<Integer> q = new LinkedList<>();
int N = sc.nextInt();
for (int n = 1; n <= N; n++) {
q.add(n);
}
while (true) {
if (q.size() == 1)
break;
sb.append(q.poll()).append(" ");
q.add(q.poll());
}
System.out.println(sb.append(q.poll()));
sc.close();
}
}복잡도
- 시간: O(N)
- 공간: O(N)