코딩테스트

[백준 / 실버3] 1021 : 회전하는 큐 (JAVA)

lyndaa 2023. 3. 26. 21:37

문제


풀이 방법

  • LinkedList 활용하여 구현한다.
    • 찾고자하는 원소의 위치를 바로 찾기 위해(indexOf)
  • 뽑고자 하는 원소의 위치가 리스트의 중앙을 기준으로 왼쪽인지 오른쪽인지를 판단하여 이에 따라 연산한다.
    • 중앙 기준 왼쪽 위치
      • 첫번째 원소를 뽑고 마지막에 추가
    • 중앙 기준 오른쪽 위치
      • 마지막 원소를 뽑고 처음에 추가

코드

package boj1021;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        LinkedList<Integer> que = new LinkedList<>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] arr = new String[2];
        arr = br.readLine().split(" ");
        int n = Integer.parseInt(arr[0]);
        int m = Integer.parseInt(arr[1]);
        int index, halfIndex, count=0;
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] seq = new int[m];

        for(int i=1; i<=n; i++){
            que.add(i);
        }
        for(int i=0; i<m; i++){
            seq[i] = Integer.parseInt(st.nextToken());
        }
        for(int i=0; i<m; i++){
            index = que.indexOf(seq[i]);
            halfIndex = que.size()%2==0 ? que.size()/2-1 : que.size()/2;

            if(index<=halfIndex) {
                for(int j=0; j<index; j++){
                    int a = que.pollFirst();
                    que.addLast(a);
                    count++;
                }
            }else{
                for(int j=0; j<que.size()-index; j++){
                    que.addFirst(que.pollLast());
                    count++;
                }
            }
            que.pollFirst();
        }
        System.out.println(count);

    }
}