[Algorithm] 백준 1021 회전하는 큐 - java


//지민이는 N개의 원소를 포함하고 있는 양방향 순환 큐를 가지고 있다. 지민이는 이 큐에서 몇 개의 원소를 뽑아내려고 한다.
//지민이는 이 큐에서 다음과 같은 3가지 연산을 수행할 수 있다.
//첫번째 원소를 뽑아낸다. 이 연산을 수행하면, 원래 큐의 원소가 a1, ..., ak이었던 것이 a2, ..., ak와 같이 된다.
//왼쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 a2, ..., ak, a1이 된다.
//오른쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., akak, a1, ..., ak-1이 된다.
//큐에 처음에 포함되어 있던 수 N이 주어진다. 그리고 지민이가 뽑아내려고 하는 원소의 위치가 주어진다. 
//(이 위치는 가장 처음 큐에서의 위치이다.) 이 때, 그 원소를 주어진 순서대로 뽑아내는데 드는 2번, 3번 연산의 최솟값을 출력하는 프로그램을 작성하시오.

//첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. 
//N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 
//둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가 순서대로 주어진다. 위치는 1보다 크거나 같고, N보다 작거나 같은 자연수이다.

//입력
/*
10 3
1 2 3
*/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class rotatequeue {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = 0, M = 0, result = 0;
Deque<Integer> deque = new LinkedList<>();
for(int i=0; i<2; i++){
  StringTokenizer st = new StringTokenizer(br.readLine());
   
  if(i==0){
  N = Integer.parseInt(st.nextToken());
  M = Integer.parseInt(st.nextToken());
  for (int d = 1; d <= N; d++) {
deque.add(d);
}
  }else{
  for(int j=0; j<M; j++){
  int selectNum = Integer.parseInt(st.nextToken());
  while (true) {
int idx = 0;
Iterator<Integer> it = deque.iterator();
while (it.hasNext()) {
if (it.next() == selectNum)
break;
idx++;
}
if (idx == 0) {
deque.pollFirst();
break;
} else if (deque.size() / 2 >= idx) {
deque.addLast(deque.pollFirst());
result++;
} else {
deque.addFirst(deque.pollLast());
result++;
}
  }
  }
  }
}
System.out.println(result);
}
}

댓글