카드2

29 June 2019

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

이번은 큐를 이용해 동작을 구현하는 문제를 풀어보도록 하겠습니다.

import java.util.Scanner;

public class Main {

    private static Node head = null;

    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        for (int i = 1; i <= N; i++) {
            add(i);
        }

        Node node = head;

        int ret = 0;
        while (node != null) {
            ret = node.data;
            node = remove(node);
        }

        System.out.println(ret);
    }

    private static Node remove(Node node) {
        if (node.next == node) {
            return null;
        }

        node.prev.next = node.next;
        node.next.prev = node.prev;


        return node.next.next;
    }

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

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

class Node {
    int data;
    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;
    }
}
이번에는 큐를 이용해 원순열을 생성하고, 규칙에 의해 제거하는 문제를 풀어보도록 하겠습니다.
가장 위에 있는 카드를 버리고 그 다음 카드를 가장 아래로 이동시키는 동작이므로,큐에서는 현재 노드를 제거하고 그 다음 다음 노드로 이동하는 것과 똑같습니다.
노드를 이동하게 되면 전체가 원모양이므로 바로 이전에 있던 노드는 가장 끝으로 이동하는 것과 같기 때문입니다.
위와 같은 logic으로 그대로 코드로 구현해주도록 합니다.