๐Ÿ“ฌ algorithm

[๋ฌธ์ œ ํ’€์ด] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ(java)

jcowwk 2024. 4. 8. 15:20

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ(java)


https://school.programmers.co.kr/learn/courses/30/parts/14393

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค > ๊ทธ๋ž˜ํ”„ - ๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ

๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค !

 

1. ์ฒ˜์Œ ์ œ์ถœํ•œ ์ฝ”๋“œ (ํ”Œ๋กœ์ด๋“œ-์›Œ์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜)

2. ๋‹ค์Œ ์ œ์ถœํ•œ ์ฝ”๋“œ (๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜)


1. ์ฒ˜์Œ ์ œ์ถœํ•œ ์ฝ”๋“œ (ํ”Œ๋กœ์ด๋“œ-์›Œ์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜)

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… ์‹œ๊ฐ„์— ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•ด ๋ฐฐ์šด ์ ์ด ์žˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ ์ค‘์—์„œ ํ”Œ๋กœ์ด๋“œ-์›Œ์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ

(๊ณต๋ถ€ํ•  ๋•Œ ๊ฐ€์žฅ ์ดํ•ด๊ฐ€ ์ž˜๋์–ด์„œ ํ—ˆํ—ˆ..)

์ผ๋‹จ ์ œ์ถœํ•ด๋ดค๋‹ค.

 

// ๋ฉ”๋ชจ๋ฆฌ & ์‹œ๊ฐ„ ์ดˆ๊ณผ
class Solution {
    public int min(int a, int b) {
        if (a >= b) {
            return b;
        } else {
            return a;
        }
    }
    
    public int solution(int n, int[][] edge) {
        int answer = 0;
        
        int[][] vertex = new int[n + 1][n + 1];
        
        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                vertex[i][j] = 9999;
            }
        }
        
        // ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ
        for (int i = 0; i < edge.length; i++) {
            int start = edge[i][0];
            int end = edge[i][1];
            
            vertex[start][end] = 1;
            vertex[end][start] = 1;
        }
        
        // ์ตœ๋‹จ ๊ฒฝ๋กœ ์—…๋ฐ์ดํŠธ (ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ)
        for (int k = 1; k <= n; k++) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    vertex[i][j] = min(vertex[i][j], vertex[i][k] + vertex[k][j]);
                }
            }
        }
        
        int max = 0;
        // 1๋ฒˆ ๋…ธ๋“œ์—์„œ ๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
        for (int i = 2; i <= n; i++) {
            if (max < vertex[1][i]) {
                max = vertex[1][i];
            }
        }
        
        // ๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ๊ฐ„์„  ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ
        for (int i = 2; i <= n; i++) {
            if (vertex[1][i] == max) {
                answer++;
            }
        }
        
        return answer;
    }
}

 

ํ…Œ์ŠคํŠธ 6๊นŒ์ง€๋Š” ํ†ต๊ณผํ–ˆ์ง€๋งŒ, ํ”Œ๋กœ์ด๋“œ-์›Œ์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N^3)์ด๊ธฐ ๋•Œ๋ฌธ์—

ํ…Œ์ŠคํŠธ 7๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

- ํ”Œ๋กœ์ด๋“œ-์›Œ์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ฒ˜์Œ์— ๋ชจ๋“  ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋ฅธ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ 9999๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๋‹ค์Œ์œผ๋กœ ๊ฐ„์„ ์ด ์กด์žฌํ•˜๋ฉด 1๋กœ ์ดˆ๊ธฐํ™” ํ–ˆ๋‹ค.

[0][n], [n][0]์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ฐ˜๋ชฉ๋ฌธ์€ 1๋กœ ์‹œ์ž‘ํ•˜๋„๋ก ํ–ˆ๋‹ค.

 

์šฐ๋ฆฌ๋Š” 1->2๋กœ ๊ฐˆ ๋•Œ๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ž„์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, 1->4๋กœ ๊ฐˆ ๋•Œ๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋Š”๊ฑธ๊นŒ?

 

๋ฐ”๋กœ 1->2, 2->4์™€ ๊ฐ™์ด ์—ฐ๊ฒฐ๋˜๋Š” ์ง€์ ์„ ํ†ตํ•˜์—ฌ 1->4๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์ด ์ ์„ ์ด์šฉํ•˜์—ฌ vertex[i][k] + vertex[k][j]์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ ,

์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— vertex[i][j] = min(vertex[i][j], vertex[i][k] + vertex[k][j]); ๊ฐ€ ๋œ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ตœ์ข…์ ์œผ๋กœ ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. ๋‹ค์Œ ์ œ์ถœํ•œ ์ฝ”๋“œ (๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜)

๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„์„ ์‹ ๊ฒฝ ์จ์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋” ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ–ˆ๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ, ํ”„๋ฆผ, ๋ฒจ๋งŒ-ํฌ๋“œ, ํฌ๋ฃจ์Šค์นผ, DFS, BFS ๋“ฑ.. ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กด์žฌํ•œ๋‹ค.

 

๊ฐ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งˆ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์ด ์žˆ์–ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ

๊ฐœ๋…์ด ๊ฐ€๋ฌผ๊ฐ€๋ฌผํ•ด์„œ ๋‹ค์‹œ ์ฐพ์•„๋ดค๋‹ค.

 

์ด ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ์ •์ ์—์„œ ๋ชจ๋“  ๋‹ค๋ฅธ ๊ฒฝ๋กœ์˜ ์ •์ ๊นŒ์ง€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๊ธฐ์—

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. 

 

์•ž์œผ๋กœ ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํŠน์„ฑ๊ณผ ๊ฐœ๋…์„ ํ™•์‹คํ•˜๊ฒŒ ํ•˜๊ณ ,

๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ๊ณ  ํ’€์–ด์•ผ๊ฒ ๋‹ค. (ใ„ฑ-)

 

import java.util.*;

class Solution {
    public int solution(int n, int[][] edge) {
        final int INF = 9999;
        
        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        List<List<int[]>> graph = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }

        // ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ
        for (int[] e : edge) {
            int start = e[0];
            int end = e[1];
            graph.get(start).add(new int[]{end, 1});
            graph.get(end).add(new int[]{start, 1});
        }

        // ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
        int[] distances = new int[n + 1];
        Arrays.fill(distances, INF);
        distances[1] = 0;
        PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> Integer.compare(a[1], b[1]));
        pq.offer(new int[]{1, 0});

        while (!pq.isEmpty()) {
            int[] current = pq.poll();
            int node = current[0];
            int distance = current[1];
            if (distance > distances[node]) continue;

            for (int[] neighbor : graph.get(node)) {
                int nextNode = neighbor[0];
                int weight = neighbor[1];
                int nextDistance = distance + weight;
                if (nextDistance < distances[nextNode]) {
                    distances[nextNode] = nextDistance;
                    pq.offer(new int[]{nextNode, nextDistance});
                }
            }
        }

        // ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ ์ฐพ๊ธฐ
        int maxDistance = 0;
        for (int i = 1; i <= n; i++) {
            if (distances[i] != INF && distances[i] > maxDistance) {
                maxDistance = distances[i];
            }
        }

        // ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
        int answer = 0;
        for (int i = 1; i <= n; i++) {
            if (distances[i] == maxDistance) {
                answer++;
            }
        }

        return answer;
    }
}

 

- ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์„ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ 

ํ•ด๋‹น ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋“ค์˜ ๋น„์šฉ์„ ๊ฐฑ์‹ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์ด๋Š” ์šฐ์„ ์ˆœ์œ„ ํ์™€ ์ˆœ์ฐจ ํƒ์ƒ‰์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ˆœ์ฐจ ํƒ์ƒ‰์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2)์ด๊ณ , ์œ„์—์„œ O(N^3)์ผ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์—

์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(E log V)์ธ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜์˜€๋‹ค.

 

1๋ฒˆ ๋…ธ๋“œ์—์„œ 6๋ฒˆ ๋…ธ๋“œ๊นŒ์ง€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” distances ๋ฐฐ์—ด๊ณผ

๋…ธ๋“œ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” pq ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ–ˆ๋‹ค.

 

int[] current = pq.poll(); ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์ •์ ๊ณผ ๊ฑฐ๋ฆฌ๋ฅผ current ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.

for๋ฌธ์„ ํ†ตํ•ด ๋‹ค์Œ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.


์ด๋ฒˆ์—๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ดค์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋งŒ๋‚˜๋ด…์‹œ๋‹ค์š” !