알고리즘

[백준, 자바, 1021번] 회전하는 큐

hminor 2023. 12. 19. 12:32

풀이

  • 풀면 풀 수록 자바보단 파이썬이 너무 편하다는 걸 느끼게 된다...
  • 우선 자바에서 deque를 사용할 때엔 Deque를 사용하면서 안의 배열은
  • 자유롭게 사용하지만 보통은 ArrayDeque나 LinkedList를 사용한다고 하는 것 같다.
  • 그리고 다른 것은 뭐 그냥 간단한 것이기에 해결이 쉽지만
  • 뭔가 애를 먹었던 부분이 else의 if 문에서 인덱스와 dq.size()/2 부분에서
  • 정수 나누기 정수의 경우엔 정수로 되는 부분으로 한참 고생을 했다.
  • 그리고 파이썬에서는 간단하게 인덱스를 찾을 수 있었지만 
  • 잘 몰라서 그런지 할 수 없다는 것을 알게 되어 따로 메서드를 정의하여 해결
  • 마지막으로 문제에서 2번,3번 연산의 최솟값을 출력하라고 해서 
  • 둘 중 작은 값으로 출력해야하는 줄 알고도 조금 ... ㅎ

 

import java.io.*;
import java.util.*;

public class 회전하는큐 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st1 = new StringTokenizer(br.readLine());
        StringTokenizer st2 = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st1.nextToken());
        int m = Integer.parseInt(st1.nextToken());
        int cnt = 0;

        Deque<Integer> dq = new ArrayDeque<>();
        for (int i = 1; i <= n; i++) dq.add(i);

        for (int i = 0; i < m; i++) {
            int x = Integer.parseInt(st2.nextToken());
            while (true) {
                if (x == dq.getFirst()) {
                    dq.removeFirst();
                    break;
                }
                else {
                    if (indexOf(dq, x) < (double) dq.size()/2) {
                        while (dq.getFirst() != x) {
                            cnt ++;
                            dq.addLast(dq.removeFirst());
                        }
                    } else {
                        while (dq.getFirst() != x) {
                            cnt ++;
                            dq.addFirst(dq.removeLast());
                        }
                    }
                }
            }
        }
        System.out.println(cnt);
    }
    private static double indexOf(Deque<Integer> deque, int target) {
        Iterator<Integer> dq = deque.iterator();
        double index = 0;

        while (dq.hasNext()) {
            if (dq.next() == target) {
                return index;
            }
            index++;
        }

        return -1;
    }
}