프린터 큐

29 June 2019

문제 : https://www.acmicpc.net/problem/1966

이번은 큐의 개념이 응용된 문제를 풀어보도록 하겠습니다.

import java.util.Scanner;

public class Main {

    private static int[] numStatics;

    private static Node head;


    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);

        int size = sc.nextInt();

        for (int i = 0; i < size; i++) {

            numStatics = new int[10];
            head = null;


            int arrSize = sc.nextInt();
            int targetNum = sc.nextInt();
            for (int k = 0; k < arrSize; k++) {
                int val = sc.nextInt();
                Node node = addNode(val);
                numStatics[val]++;
                if (k == targetNum) {
                    node.isTarget = true;
                }
            }
            int count = 0;
            Node node = head;
            while (true) {

                if (!node.deleted) {
                    boolean deleteFlag = true;
                    for (int m = node.data + 1; m < 10; m++) {
                        if (numStatics[m] > 0) {
                            deleteFlag = false;
                            break;
                        }
                    }

                    if (deleteFlag) {
                        count++;
                        numStatics[node.data]--;
                        node.deleted = true;
                        if (node.isTarget) {
                            break;
                        }
                    }
                }

                node = node.next;
            }

            System.out.println(count);


        }
    }

    private static Node addNode(int data) {
        Node node = new Node(data);
        if (head == null) {
            head = node;
            head.prev = node;
            head.next = node;
        } else {
            node.next = head;
            node.prev = head.prev;

            head.prev.next = node;
            head.prev = node;
        }
        return node;
    }
}

class Node {
    int data;
    boolean isTarget = false;
    boolean deleted = false;
    Node prev;
    Node next;

    Node(int data) {
        this.data = data;
    }

    Node(int data, Node prev, Node next) {
        this.data = data;
        this.prev = prev;
        this.next = next;
    }
}
이번에는 큐를 이용해 원순열을 생성하고, 규칙적으로 제거하는 문제를 풀어보도록 하겠습니다.
가장 먼저 데이터를 넣으면서 큐를 원모양으로 반복되게 만들어줍니다.그렇게 하여 마지막 노드까지 이동한 이후에는 그 다음은 다시 head로 이동하게 됩니다.
또한 데이터를 입력할 때 현재의 값이 어떤 값들이 있는지도 array에 저장해주어, 해당값보다 큰 값이 있는지 체크가 가능하도록 합니다.
마지막으로 head부터 차례대로 돌아가면서 해당값보다 큰 값이 없으면 deleted로 체크해주고 targetNode가 삭제될 때까지 반복합니다.