๊ธฐ๋ก๋ฐฉ

BOJ_24042 : ํšก๋‹จ๋ณด๋„ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_24042 : ํšก๋‹จ๋ณด๋„

Soom_1n 2024. 8. 1. 21:07

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • N๊ฐœ์˜ ์ง€์—ญ๊ณผ M๊ฐœ์˜ ํšก๋‹จ๋ณด๋„๊ฐ€ ์žˆ๋‹ค.
  • ํšก๋‹จ๋ณด๋„๋Š” ์ž…๋ ฅ ์ˆœ์„œ๋Œ€๋กœ 0~M-1 ์ดˆ์— ํŒŒ๋ž€๋ถˆ์ด ์ผœ์ ธ ๊ฑด๋„ ์ˆ˜ ์žˆ๋‹ค.
  • 1๋ฒˆ ์ง€์—ญ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•ด N๋ฒˆ ์ง€์—ญ์— ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ ๋ฌธ์ œ ํ’€์ด ๐Ÿ”ธ

  • N์ด ์ตœ๋Œ€ 10๋งŒ, M์ด ์ตœ๋Œ€ 70๋งŒ์ด๋ฏ€๋กœ BFS๋กœ ์ตœ๋‹จ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค. ๋”ฐ๋ผ์„œ Dijkstra(๋‹ค์ต์ŠคํŠธ๋ผ) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด ์ตœ๋‹จ์‹œ๊ฐ„์„ ๊ตฌํ•œ๋‹ค.
  • ํ˜„์žฌ ์ง€์—ญ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ ์ง€์—ญ์„ ๊ฑด๋„ ๋•Œ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๊ณ , ๊ธฐ๋ก ๋œ ์†Œ์š” ์‹œ๊ฐ„๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.*;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        ArrayList<Sign>[] adjList = new ArrayList[N + 1]; // ๊ฒฝ๋กœ+์‹œ๊ฐ„
        long[] result = new long[N + 1]; // ์ตœ๋‹จ ์‹œ๊ฐ„

        for (int i = 1; i <= N; i++) {
            adjList[i] = new ArrayList<>();
            result[i] = Long.MAX_VALUE;
        }

        for (int i = 1; i <= M; i++) {
            st = new StringTokenizer(br.readLine());
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());
            adjList[A].add(new Sign(B, i));
            adjList[B].add(new Sign(A, i));
        }

        // Dijkstra
        Queue<Road> q = new PriorityQueue<>();
        q.add(new Road(1, 0L));
        result[1] = 0;

        while (!q.isEmpty()) {
            Road road = q.poll();
            if (road.time > result[road.site]) { // ์ด๋ฏธ ๋” ๋น ๋ฅธ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌํ•จ
                continue;
            }
            if (road.site == N) { // N ์ฐพ์Œ
                break;
            }

            // ์ตœ๋‹จ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ
            for (Sign sign : adjList[road.site]) {

                int temp = (int) (road.time % M); // ํ˜„์žฌ ์‹œ๊ฐ„์˜ ์ฃผ๊ธฐ ์œ„์น˜

                if (temp <= sign.minT) { // ์ด๋ฒˆ ์ฃผ๊ธฐ์— ์ด๋™
                    temp = sign.minT - temp; // ์ถ”๊ฐ€๋˜๋Š” ์‹œ๊ฐ„
                } else { // ๋‹ค์Œ ์ฃผ๊ธฐ์— ์ด๋™
                    temp = sign.minT + M - temp; // ์ถ”๊ฐ€๋˜๋Š” ์‹œ๊ฐ„
                }

                if (result[sign.site] > road.time + temp) { // ๋” ์งง์€ ๊ฒฝ์šฐ ์ฐพ์Œ
                    result[sign.site] = road.time + temp; // ์—…๋ฐ์ดํŠธ
                    q.add(new Road(sign.site, road.time + temp)); // ํ์—๋„ ๋„ฃ๊ธฐ
                }
            }
        }

        // Output
        bw.write(Long.toString(result[N]));
        bw.flush();
    }

    private static class Sign {
        int site;
        int minT;

        public Sign(int site, int minT) {
            this.site = site;
            this.minT = minT;
        }
    }

    private static class Road implements Comparable<Road> {
        int site;
        long time;

        public Road(int site, long time) {
            this.site = site;
            this.time = time;
        }

        @Override
        public int compareTo(Road o) {
            return Long.compare(this.time, o.time);
        }
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ๊ฐ ํšก๋‹จ๋ณด๋„์˜ ํŒŒ๋ž€๋ถˆ์ด ์ผœ์ง€๋Š” ์‹œ๊ฐ„๊ณผ ๋„์ฐฉ์ง€๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Sign ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
    • minT๋Š” ๋ถˆ์ด ์ผœ์ง€๋Š” ์‹œ๊ฐ„์ž„๊ณผ ๋™์‹œ์—, ํšก๋‹จ๋ณด๋„ ์ฃผ๊ธฐ์˜ ์ธ๋ฑ์Šค์ด๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์œ„ํ•ด Road ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ๋‹ค.
    • ํ˜„์žฌ ์ง€์—ญ ๋ฒˆํ˜ธ์™€ ๋„์ฐฉํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ์ €์žฅํ•œ๋‹ค.
    • ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ๊ธฐ ์œ„ํ•ด compareTo() ๋ฉ”์„œ๋“œ๋„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ–ˆ๋‹ค.
  • ๊ฒฝ๋กœ์™€ ์‹œ๊ฐ„์„ Signํด๋ž˜์Šค๋ฅผ ์ธ์ž๋กœ ๊ฐ–๋Š” ArrayList ๋ฐฐ์—ด adjList๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
    • ์ž…๋ ฅ๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ €์žฅํ•œ๋‹ค.
    • ์ž…๋ ฅ ์ธ๋ฑ์Šค๋ฅผ minT๋กœ ์ €์žฅํ•œ๋‹ค.
  • ์ตœ๋‹จ์‹œ๊ฐ„์„ ์ €์žฅํ•  long๋ฐฐ์—ด result๋ฅผ Long์˜ ์ตœ๋Œ“๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • ์šฐ์„ ์ˆœ์œ„ ํ q์— Road ํด๋ž˜์Šค๋ฅผ ์ธ์ž๋กœํ•˜๊ณ  ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•œ๋‹ค.
    • N์„ ์ฐพ์„ ๋•Œ ๊นŒ์ง€ ์ตœ๋‹จ์‹œ๊ฐ„์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
    • ํ˜„์žฌ ์‹œ๊ฐ„์˜ ์ฃผ๊ธฐ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•ด, ๋‹ค์Œ ๊ฒฝ๋กœ์˜ ์‹œ๊ฐ„์ด ์ด๋ฒˆ ์ฃผ๊ธฐ์ธ์ง€ ๋‹ค์Œ ์ฃผ๊ธฐ์ธ์ง€ ํŒ๋‹จํ•˜๊ณ  ์ถ”๊ฐ€ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•œ๋‹ค.
    • ์ด๋ฒˆ ๊ฒฝ๋กœ๊ฐ€ result์— ์ €์žฅ ๋œ ์‹œ๊ฐ„๋ณด๋‹ค ์งง๋‹ค๋ฉด, result ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํ์— ๋„ฃ์–ด ๋‹ค์‹œ ํƒ์ƒ‰ํ•œ๋‹ค
  • ์ตœ์ข… result[N]์— ์ €์žฅ๋œ ์ตœ์†Œ์‹œ๊ฐ„์„ ์ถ”๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์–ด๋ ค์› ๋‹ค. ์ฒ˜์Œ์— ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ž„์„ ์•Œ์•˜์ง€๋งŒ ๋ฌธ์ œ ์ดํ•ด๋„ ๋„ˆ๋ฌด ์–ด๋ ต๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ BFS๋กœ ๋จผ์ € ํ’€์–ด๋ณด์•˜๋‹ค.
  • ๋‹น์—ฐํžˆ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๊ณ , ๊ฒฐ๊ตญ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํƒœ๊ทธ๋ฅผ ๋ณด๊ณ  Dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๊ฑธ ์•Œ๊ณ  ๋‹ค์‹œ ํ’€์–ด์„œ ์ด 1์‹œ๊ฐ„+1์‹œ๊ฐ„ = 2์‹œ๊ฐ„ ์†Œ์š”๋กœ ํ’€์–ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
    • ํšก๋‹จ๋ณด๋„ ์ฃผ๊ธฐ์ธ M์ด 70๋งŒ์œผ๋กœ, ์ฃผ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ int๋ฅผ ๋„˜์„ ์ˆ˜ ์žˆ์–ด long์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ–ˆ๋‹ค.
    • ์ž…๋ ฅ๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฃผ๊ธฐ ์ธ๋ฑ์Šค(์‹œ๊ฐ„)๊ณผ ํ•จ๊ป˜ ์ €์žฅํ•˜๋Š”๊ฒŒ ์ƒ์†Œํ–ˆ๋‹ค.
  • ์ข€ ์›ƒ๊ธด ์–˜๊ธฐ์ง€๋งŒ, ๋ฌธ์ œ์˜ ์‹œ๊ฐ„ ์กฐ๊ฑด์ด ํ‹€๋ฆฐ ์ค„ ์•Œ๊ณ  ์˜ค๋ฅ˜ ์ˆ˜์ •์„ ๊ฑด์˜ํ•  ๋ป” ํ–ˆ๋‹ค.
    • ํŒŒ๋ž€๋ถˆ์ด 1์ดˆ ~ M์ดˆ์— ์ผœ์ง„๋‹ค๊ณ  ์ดํ•ด์„œ, N=2์ผ๋•Œ ๋„์ฐฉํ•˜๋ฉด 1์ดˆ๊ฐ€ ์•„๋‹ˆ๋ผ 2์ดˆ๊ฐ€ ์•„๋‹Œ๊ฐ€? ์‹ถ์—ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ๋ถˆ์ด ์ผœ์ง€๋Š” ๊ฑด 0์ดˆ~M์ดˆ์˜€๋‹ค. ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ๋‚˜์„œ๋„ ์ดํ•ด๋ฅผ ์ž˜ ๋ชปํ–ˆ๋˜ ๋ถ€๋ถ„์ด ์žˆ๋Š”๊ฒŒ ์›ƒ๊ธฐ๊ณ  ๋ฐ˜์„ฑํ•˜๊ฒŒ ๋๋‹ค...(๊ธ€ ์“ฐ๋ฉด์„œ ๋‹ค์‹œ ํ™•์ธํ•˜๋‹ค๊ฐ€ ์•Œ๊ฒŒ๋๋‹ค. ์“ฐ๊ธฐ์ „์— ์•Œ์•„์„œ ๋‹คํ–‰์ด๋‹ค...)

728x90