💡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);
    }
}

'💡Problem Solving > BOJ' 카테고리의 다른 글

[BOJ 2630] 색종이 만들기 (Java)  (0) 2021.11.16
[BOJ 5430] AC (Java)  (0) 2021.11.15
[BOJ 18258] 큐 2 (Java)  (0) 2021.11.14
[BOJ 4949] 균형잡힌 세상 (Java)  (0) 2021.11.14
[BOJ 9012] 괄호 (Java)  (0) 2021.11.14