백준
백준 2164: 카드 2(java)
unhyepnhj
2024. 7. 16. 17:17
문제

풀이
큐의 front에서 뽑아낸 값을 rear에 삽입해야 하므로, 양 끝단에서 삽입과 삭제가 모두 일어나는 덱을 사용하여 풀면 된다.
(덱에 대한 자세한 설명은 링크)

https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Deque.html
Deque (Java SE 21 & JDK 21)
Type Parameters: E - the type of elements held in this deque All Superinterfaces: Collection , Iterable , Queue , SequencedCollection All Known Subinterfaces: BlockingDeque All Known Implementing Classes: ArrayDeque, ConcurrentLinkedDeque, LinkedBlockingDe
docs.oracle.com
문제를 읽어 보면,
- 제일 위에 있는 카드를 바닥에 버리는 것 = removeFirst()
- 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮기는 것 = removeFirst()해서 addLast()
으로 생각할 수 있다.
우선 N을 입력받고, for문을 사용해 덱에 정수 값들을 삽입해 준다.
for(int i=1; i<N+1; i++) {
deque.addLast(i);
}
1부터 출력되어야 하므로 addFirst()가 아닌 addLast()를 사용한다. getFirst(), removeFirst()로 값을 뽑아내는 상황에서 addFirst()를 하면 N부터 출력되기 때문이다. getLast, removeLast()로 출력할 경우 addFirst()로 삽입한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
Deque<Integer> deque=new LinkedList<>();
int N=Integer.parseInt(in.readLine());
for(int i=1; i<N+1; i++) {
deque.addLast(i);
}
while(true) {
if(deque.size()==1) {
System.out.println(deque.getFirst());
break;
}
deque.removeFirst();
deque.addLast(deque.removeFirst());
}
}
}
덱을 직접 구현하지 않고 라이브러리에 기본 제공되는 덱 인터페이스를 사용하였다.