Algorithm/๊ทธ๋ฆฌ๋””(Greedy)

[๋ฐฑ์ค€, Java] 10775๋ฒˆ : ๊ณตํ•ญ

Zayson 2022. 6. 21. 14:25

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/10775

๐Ÿ˜ฎ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋ฌธ์ œ์—์„œ ๋น„ํ–‰๊ธฐ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋„์ฐฉํ•  ์˜ˆ์ •์ด๊ณ  ๊ฐ ๋น„ํ–‰๊ธฐ์˜ ๊ฐ’์€ 1๋ถ€ํ„ฐ ํ•ด๋‹น ๊ฐ’๊นŒ์ง€์˜ ๊ฒŒ์ดํŠธ์— ๋„ํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ž์‹ ์˜ ์ˆœ์„œ์— ๋น„ํ–‰๊ธฐ๊ฐ€ ๋„ํ‚นํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์ค€๋‹ค.

๋น„ํ–‰๊ธฐ๊ฐ€ ๋„ํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ์ดํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ Union-Find๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

๊ฒŒ์ดํŠธ ๋ฐฐ์—ด์„ ์ž์‹ ์˜ ๊ฒŒ์ดํŠธ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ณ , ํ•ด๋‹น ๊ฐ’์˜ ๋น„ํ–‰๊ธฐ๊ฐ€ ๋„ํ‚น๋˜๋ฉด ๋‹ค์Œ์— ๋„ํ‚น๋  ๋™์ผํ•œ ๊ฐ’์˜ ๋น„ํ–‰๊ธฐ๋Š” ํ˜„์žฌ ๊ฒŒ์ดํŠธ๋ณด๋‹ค ํ•˜๋‚˜ ์ž‘์€ ๊ฒŒ์ดํŠธ๋กœ ๋„ํ‚น๋˜์–ด์•ผ ํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์ดํŠธ๊ฐ€ 4๊ฐœ์ด๊ณ  ์•„๋ฌด ๋น„ํ–‰๊ธฐ๋„ ๊ฒŒ์ดํŠธ์— ๋„ํ‚น๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ฒŒ์ดํŠธ ๋ฐฐ์—ด์€ 1,2,3,4๊ฐ’์„ ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค.

3๋ฒˆ ๋น„ํ–‰๊ธฐ๊ฐ€ 3๋ฒˆ ๊ฒŒ์ดํŠธ์— ๋„ํ‚น๋˜๋ฉด ์ด ํ›„์— ๋“ค์–ด์˜ค๋Š” 3๋ฒˆ ๋น„ํ–‰๊ธฐ๋Š” 1 ์•„๋‹ˆ๋ฉด 2๋ฒˆ ๊ฒŒ์ดํŠธ์— ๋„ํ‚น๋˜์–ด์•ผ ํ•œ๋‹ค. 2๋ฒˆ ๊ฒŒ์ดํŠธ๋กœ ๋“ค์–ด์˜ฌ ๋•Œ ๋„ํ‚น๋  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ์ดํŠธ์™€ 3๋ฒˆ ๊ฒŒ์ดํŠธ๋กœ ๋“ค์–ด์˜ฌ ๋•Œ ๋„ํ‚น๋  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ์ดํŠธ๋ฅผ ํ•ฉ์ณ์ค€๋‹ค.

 

์ด ๋•Œ, Union - Find๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ๋„ํ‚น๋  ๊ฒŒ์ดํŠธ๋ฅผ ์ง‘ํ•ฉ์œผ๋กœ ํ•ฉ์ณ์ค€๋‹ค

  1. ํ˜„์žฌ ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ํฐ ๊ฒŒ์ดํŠธ๋ฅผ find ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ฐพ๋Š”๋‹ค.
  2. ๋งŒ์•ฝ ์ฐพ์€ ๊ฒŒ์ดํŠธ๊ฐ€ 0๋ฒˆ ๊ฒŒ์ดํŠธ๋ผ๋ฉด (๋„ํ‚นํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ) ๋ฐ˜๋ณต๋ฌธ์„ ํƒˆ์ถœํ•œ๋‹ค .
  3. ํ˜„์žฌ ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ํฐ ๊ฒŒ์ดํŠธ๋ฅผ ์ด์šฉํ–ˆ๋‹ค๋ฉด, ํ˜„์žฌ ์ด์šฉํ•œ ๊ฒŒ์ดํŠธ์™€ ๋‹ค์Œ๋ฒˆ์— ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ๋น„ํ–‰๊ธฐ๊ฐ€ ๋„ํ‚นํ•  ๊ฒŒ์ดํŠธ (ํ˜„์žฌ ์ด์šฉํ•œ ๊ฒŒ์ดํŠธ -1)๊ณผ Union์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋‹ค์Œ ๋„ํ‚นํ•  ๊ฒŒ์ดํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

๐Ÿšฉ Java ์ฝ”๋“œ

package com.algorithm.Baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Main_10775_๊ณตํ•ญ {
    private static List<Integer> plane;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int G = Integer.parseInt(br.readLine());
        int P = Integer.parseInt(br.readLine());

        plane = new ArrayList<>();
        for (int airplane = 0; airplane < P; airplane++) {
            plane.add(Integer.parseInt(br.readLine()));
        }

        int rst = dockingAirplane(G, P);
        System.out.println(rst);
        br.close();
    }

    private static int dockingAirplane(int g, int p) {
        int[] gates = new int[g + 1];
        for (int gate = 1; gate <= g; gate++) {
            gates[gate] = gate;
        }

        int count = 0;
        for (Integer airplane : plane) {
            // ์ด์šฉ๊ฐ€๋Šฅํ•œ ๊ฒŒ์ดํŠธ ์ฐพ๊ธฐ
            int availableGate = find(gates, airplane);
						// ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒŒ์ดํŠธ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ
            if(availableGate < 1) break;

            // ๊ฒŒ์ดํŠธ์— ๋ฐฐ์น˜ ํ–ˆ์œผ๋‹ˆ ํ˜„์žฌ ๋น„ํ–‰๊ธฐ์™€ ๋™์ผํ•œ ๊ฒŒ์ดํŠธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„ ๋น„ํ–‰๊ธฐ ๋„ํ‚น ์‹œ ํ˜„์žฌ ๊ฒŒ์ดํŠธ๋ณด๋‹ค ํ•˜๋‚˜ ์ž‘์€ ๊ฒŒ์ดํŠธ๋ฅผ ์ด์šฉ ํ•„์š”
            union(airplane, availableGate - 1, gates);

            count++;
        }

        return count;
    }

    private static void union(Integer airplane, int nextAvailable, int[] gates) {
        int curGate = find(gates, airplane);    // ํ˜„์žฌ ๋น„ํ–‰๊ธฐ๊ฐ€ ์ด์šฉ์ค‘์ธ ๊ฒŒ์ดํŠธ ์ฐพ๊ธฐ
        int nextGate = find(gates, nextAvailable);  // ๋™์ผํ•œ ๊ฒŒ์ดํŠธ ๋ฒˆํ˜ธ ๋น„ํ–‰๊ธฐ๊ฐ€ ๋‹ค์Œ์— ๋„ํ‚น์‹œ ์‚ฌ์šฉํ•  ๊ฒŒ์ดํŠธ ์ฐพ๊ธฐ

        if(curGate > nextGate) gates[curGate] = nextGate;
        else gates[nextGate] = curGate;
    }

    private static int find(int[] gates, Integer airplane) {
        if(gates[airplane] != airplane) gates[airplane] = find(gates, gates[airplane]);
        return gates[airplane];
    }
}
๋ฐ˜์‘ํ˜•