Algorithm/Coding Test

Kakao 2021 Blind Test - Lv3. ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ (Java)

Edlin 2022. 6. 2. 00:21

๋ฌธ์ œ ์š”์•ฝ

A, B ๋‘ ์‚ฌ๋žŒ์ด ์ถœ๋ฐœ์ (s)์—์„œ ์ถœ๋ฐœํ•ด ๊ฐ๊ฐ์˜ ๋„์ฐฉ ์ง€์ ๊นŒ์ง€ ํƒ์‹œ๋ฅผ ํƒ„๋‹ค๊ณ  ํ•  ๋•Œ, ์ตœ์ € ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์„ ๊ณ„์‚ฐ

 

[๋ฌธ์ œ ์„ค๋ช…]

  1. A์™€ B๊ฐ€ ์ถœ๋ฐœ์ง€์—์„œ ๋„์ฐฉ์ง€๊นŒ์ง€ ํƒ์‹œ๋ฅผ ํƒ„๋‹ค.
  2. A์™€ B๋Š” ์–ด๋А ํŠน์ • ์ง€์ ๊นŒ์ง€ ํ•ฉ์Šนํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ํ•ฉ์Šนํ•œ ์ง€์ ์—์„œ ๋‚ด๋ฆฐ ํ›„ ๊ฐ์ž์˜ ๋„์ฐฉ์ง€๊นŒ์ง€ ๋”ฐ๋กœ ํƒ์‹œ๋ฅผ ํƒ„๋‹ค.
  4. ํ•ฉ์Šนํ•˜์—ฌ ๋„์ฐฉ์ง€๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒƒ์ด ์ตœ์†Œ ๋น„์šฉ์ธ๊ฐ€? ๋”ฐ๋กœ ํƒ์‹œ๋ฅผ ํƒ€์„œ ๋„์ฐฉ์ง€๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒƒ์ด ์ตœ์†Œ ๋น„์šฉ์ธ๊ฐ€?

[์ƒ๊ฐ์˜ ๊ณผ์ •]

  • ์ฒ˜์Œ์— ํ•ฉ์Šนํ•˜์—ฌ ๋„์ฐฉ์ง€๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒƒ๊ณผ  // ๋”ฐ๋กœ ํƒ์‹œ๋ฅผ ํƒ€์„œ ๋„์ฐฉ์ง€๊นŒ์ง€ ๋„์ฐฉํ•˜๋Š” ๋น„์šฉ(ํ•ฉ์Šนํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ƒ๊ฐํ•˜๋ ค ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋А ์ง€์ ๊นŒ์ง€ ํ•ฉ์Šนํ•˜์˜€๋Š”์ง€๋ฅผ ๋‹ตํ•˜๋Š” ๊ณณ์€ ์—†์Šต๋‹ˆ๋‹ค. 
  • ์ด๋Š” ์ถœ๋ฐœ์ ์—์„œ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ์†Œ ์š”๊ธˆ์„ ๊ตฌํ•œ ๋’ค ์ž„์˜์˜ ํ•ฉ์Šน ์ง€์ ์„ ์„ ํƒํ•˜์—ฌ ๋˜ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๋”ํ•ด์ค˜๋„ ๋œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. 
  • ์ฆ‰, ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ๊ฐ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ์ง€์ ์œผ๋กœ์˜  '์ตœ์†Œ ๋น„์šฉ'์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€์˜€์Šต๋‹ˆ๋‹ค.
  • ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ์ด ๋Œ€ํ‘œ์ ์ž…๋‹ˆ๋‹ค.
  • ์ง€์ ์˜ ๊ฐœ์ˆ˜๊ฐ€ 200์ด๊ธฐ ๋•Œ๋ฌธ์— 200 * 200 * 200์„ ํ•˜์—ฌ๋„ 1์–ต์„ ๋„˜์ง€ ์•Š์•„ ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ๋กœ ์ ‘๊ทผํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ”๏ธŽ ๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ์ ‘๊ทผํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”?

  • ๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ์ ‘๊ทผํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
  • ๋งŒ์•ฝ ๋ชจ๋“  ์ง€์ ๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค๋ฉด ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์ง€์ ์„ ๊ณ ๋ คํ•˜์—ฌ ์ตœ์†Œ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋”๋ถˆ์–ด ์ถœ๋ฐœ์ง€๋ฅผ ๊ธฐ์กด ์ถœ๋ฐœ์ ๋ฟ ์•„๋‹Œ, ํ•ฉ์Šนํ•œ ๋„์ฐฉ์ ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ์ง€์ ์œผ๋กœ๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
  • ๋ชจ๋“  ์ง€์ ์„ ์ถœ๋ฐœ์ง€๋กœ ๋‹ค๋ฅธ ์ง€์ ๋“ค๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜์—ฌ ๋งŽ์€ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ค‘ ์ „์ฒด ์ตœ์†Œ ๋น„์šฉ์„ ์ ์€ ๊ฐ’์„ ์ฐพ์•„๋‚ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•˜์—ฌ Priority Queue๋ฅผ ์ด์šฉํ•˜์—ฌ ์ตœ์†Œ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(ElogV)์ด๊ณ , 
  • ํ•˜๋‚˜์˜ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ์ง€์ ๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ๊ณผ ํ•ฉ์Šนํ•œ ๊ณณ๊นŒ์ง€ ๊ณ ๋ คํ•˜์—ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด์ž๋ฉด, (19900 log 200)
  • (19900 log 200) * (198 (์ถœ๋ฐœ์ง€์™€ ๋„์ฐฉ์ง€๋ฅผ ์ œ์™ธํ•œ, ํ•ฉ์Šนํ•˜์—ฌ ๋„์ฐฉํ•œ ๊ณณ์˜ ํ›„๋ณด ๊ฐœ์ˆ˜)) = 3,940,200 * log 200 = 9,066,518.38892์ž…๋‹ˆ๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ํ’€์–ด๋„ ๊ดœ์ฐฎ์ง€๋งŒ, ๊ณ„์‚ฐ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•˜์—ฌ ์ •๋ ฌ ๋“ฑ์˜ ์•„์ด๋””์–ด๋ฅผ ์ƒ๊ฐํ•ด๋‚ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ฝ ์กฐ๊ฑด

  • ์ง€์ ์˜ ๊ฐœ์ˆ˜ n (3 ์ด์ƒ 200 ์ดํ•˜)
  • ์ถœ๋ฐœ์ง€ s, A์˜ ๋„์ฐฉ์ง€ a, B์˜ ๋„์ฐฉ์ง€ b (1 ์ด์ƒ n ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜, ๊ฐ๊ธฐ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’)
  • fares: 2์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด (fares์˜ ๊ฐœ์ˆ˜๋Š” 1 ์ด์ƒ ์ตœ๋Œ€ ๊ฒฝ๋กœ์˜ ์ˆ˜์ธ n * (n-1) / 2 ์ดํ•˜)
    • ์ถœ๋ฐœ์ง€, ๋„์ฐฉ์ง€, ์š”๊ธˆ ( 1์ด์ƒ 100,000 ์ดํ•˜ )
    • ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
n s a b fares result
6 4 6 2 [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] 82

๋ฌธ์ œ ์ ‘๊ทผ :  ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ (๊ฒฝ์œ ์ง€ - ์ถœ๋ฐœ์ง€ - ๋„์ฐฉ์ง€)

// 22.06.01 2021 ์นด์นด์˜ค ๋ธ”๋ผ์ธ๋“œ - ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ

public class Solution {

    public static void main(String[] args) {
        int[][] fares = new int[][]{{4, 1, 10}, {3, 5, 24}, {5, 6, 2}, {3, 1, 41}, {5, 1, 24}, {4, 6, 50}, {2, 4, 66}, {2, 3, 22}, {1, 6, 25}};
        System.out.println(solution(6, 4, 6, 2, fares));
    }

    public static int solution(int n, int s, int a, int b, int[][] fares) {
        int answer = Integer.MAX_VALUE; // ์ตœ์ € ์˜ˆ์ƒ ํƒ์‹œ ์š”๊ธˆ 

    // 1. ๊ทธ๋ž˜ํ”„ ๋งŒ๋“ค๊ธฐ (์ถœ๋ฐœ์ ์ด 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค) - ์ถœ๋ฐœ์ง€๋ถ€ํ„ฐ ๋„์ฐฉ์ง€๊นŒ์ง€์˜ ๋น„์šฉ
        int[][] graph = new int[n + 1][n + 1];

		// ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™” (๊ทธ๋ž˜ํ”„๊ฐ€ ๊ฐ€์ง„ ๊ฐ’์ด ์ถœ๋ฐœ์ง€๋ถ€ํ„ฐ ๋„์ฐฉ์ง€๊นŒ์ง€์˜ ๋น„์šฉ์ด๋ฏ€๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ๊ฐ’ ๋ณ€๊ฒฝ ํ•„์š”)
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (i != j)
                    graph[i][j] = 100000 * (n-1) + 1; // ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์ง€์—ญ์„ ๋‹ค ๊ฑฐ์ณ์™”์„ ๋•Œ์˜ ํ•ฉ + 1
            }
        }

	// ์ถœ๋ฐœ์ง€๋ถ€ํ„ฐ ๋„์ฐฉ์ง€๊นŒ์ง€์˜ ์š”๊ธˆ
        for (int i = 0, length = fares.length; i < length; i++) {
            int start = fares[i][0];
            int end = fares[i][1];
            int fare = fares[i][2];

            // ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
            graph[start][end] = fare;
            graph[end][start] = fare;
        }

    // 2. ๋ชจ๋“  ์ •์ ์—์„œ ๋‹ค๋ฅธ ์ •์ ๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ ๊ตฌํ•˜๊ธฐ (ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ)
        for (int k = 1; k <= n; k++) { // ๊ฒฝ์œ ์ง€
            for (int i = 1; i <= n; i++) { // ์ถœ๋ฐœ์ง€
                if (i == k) continue;
                for (int j = 1; j <= n; j++) { // ๋„์ฐฉ์ง€
                    if (i == j || j == k) continue;
                    graph[i][j] = graph[i][j] > graph[i][k] + graph[k][j] ? graph[i][k] + graph[k][j] : graph[i][j];
                }
            }
        }

    // 3. ๋น„์šฉ ๊ตฌํ•˜๊ธฐ (ํ•ฉ์Šนํ•œ ๊ฒฝ์šฐ์™€ ํ•ฉ์Šนํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ ค)
        for (int i = 1; i <= n; i++) { // i : ๊ฐ™์ด ํ•ฉ์Šนํ•œ ์ง€์ , 1์ธ๊ฒฝ์šฐ ํ•ฉ์Šน์„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
            int cost = graph[s][i] + graph[i][a] + graph[i][b];
            if (answer > cost) // answer๊ฐ€ ๊ฐ€์ง„ ํƒ์‹œ ์š”๊ธˆ๋ณด๋‹ค ์ ์„ ๊ฒฝ์šฐ ๊ฐฑ์‹ 
                answer = cost;
        }
        return answer;
    }
}

 

๋ฌธ์ œ ๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/72413
 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ

6 4 6 2 [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] 82 7 3 4 1 [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] 14 6 4 5 6 [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4

programmers.co.kr