💡Problem Solving/BOJ
[BOJ 1021] 회전하는 큐 (Java)
gom20
2021. 11. 14. 22:36
문제
https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
풀이
어렵지 않은 문제이다. deque를 이용해서 풀면 된다.
중간 값을 찾아서 현재 수가 왼쪽에 있는지 오른쪽에 있는지 판단하는 부분에서 많이 헷갈렸다.
index 경계값 처리 하는게 머릿속으로 바로바로 안된다.
소스코드는 아래와 같다.
소스코드
package queue;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class BOJ1021 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int C = Integer.parseInt(st.nextToken());
LinkedList<Integer> deque = new LinkedList<Integer>();
for(int i = 1; i <= N; i++){
deque.offerLast(i);
}
// First ---------- Last
// 1 2 3 4 5 6 7 8 9 10
int answer = 0;
st = new StringTokenizer(br.readLine());
for(int i = 0; i < C; i++){
int num = Integer.parseInt(st.nextToken());
if(deque.peekFirst() == num){
deque.pollFirst();
} else {
int targetIdx = deque.indexOf(num)+1;
// System.out.println("targetIdx: " + targetIdx);
int size = deque.size();
int idx = 1;
if(targetIdx <= size/2 + 1){
while(idx <= targetIdx-1){
// System.out.println("peekFirst: " + deque.peekFirst());
deque.offerLast(deque.pollFirst());
answer++;
idx++;
}
} else {
while(idx <= size-targetIdx + 1){
// System.out.println("peekLast: "+deque.peekLast() );
deque.offerFirst(deque.pollLast());
answer++;
idx++;
}
}
deque.pollFirst();
}
}
System.out.println(answer);
}
}