큐 관련 문제를 풀어보았다.
자바 Queue 클래스를 사용해서..
import java.util.LinkedList;
import java.util.Queue;
Queue<Integer> queue = new LinkedList<>();
LinkedList를 이용하여 생성한다.
두가지 import문이 필요하다.
queue.add(1); // 1 추가
queue.offer(2) // 2 추가
queue.peek() // 첫번째 값 참조 (1)
queue.poll // 첫번째 값을 반환하고 제거 (1 반환 후 제거)
queue.remove // 첫번째 값 제거 (2 제거)
queue.clear() // queue 초기화
queue.size() // 큐의 사이즈 반환
https://www.acmicpc.net/problem/2164
큐의 메소드만 잘 활용하면 쉽게 풀 수있다.
제일 위에 있는 카드를 바닥에 버린다. => queue.remove()
그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.
=> queue.poll() 로 반환 값을 얻은 뒤
queue.offer() 혹은 queue.add()로 다시 반환 값을 추가한다.
3. 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다.
=> 이게 중요하다. 입력 값으로 1을 주었을 때 런타임 에러가 나지 않도록 처리해준다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Queue<Integer> queue=new LinkedList<>();
int n= Integer.parseInt(br.readLine());
int a=0;
for(int i=1;i<=n;i++) {
queue.offer(i);
}
while(queue.size()!=1) { //입력 값 1의 대한 처리
queue.remove();
if(queue.size()==1) { //카드가 한 장만 남으면 break;
break;
}else {
a=queue.poll();
queue.offer(a);
}
}
bw.write(String.valueOf(queue.poll()));
bw.flush();
bw.close();
br.close();
}
}
BufferedWriter로 출력할 때 문자가 자꾸 깨져서 String.valueOf() 로 처리 해 주었다.
Sysout 으로 출력하면 문제가 안 생기는데.. 왜 그럴까