Algorithm/Coding Test
Kakao 2021 Blind Test - Lv3. ํฉ์น ํ์ ์๊ธ (Java)
Edlin
2022. 6. 2. 00:21
๋ฌธ์ ์์ฝ
A, B ๋ ์ฌ๋์ด ์ถ๋ฐ์ (s)์์ ์ถ๋ฐํด ๊ฐ๊ฐ์ ๋์ฐฉ ์ง์ ๊น์ง ํ์๋ฅผ ํ๋ค๊ณ ํ ๋, ์ต์ ์์ ํ์์๊ธ์ ๊ณ์ฐ
[๋ฌธ์ ์ค๋ช ]
- A์ B๊ฐ ์ถ๋ฐ์ง์์ ๋์ฐฉ์ง๊น์ง ํ์๋ฅผ ํ๋ค.
- A์ B๋ ์ด๋ ํน์ ์ง์ ๊น์ง ํฉ์นํ ์ ์๋ค.
- ํฉ์นํ ์ง์ ์์ ๋ด๋ฆฐ ํ ๊ฐ์์ ๋์ฐฉ์ง๊น์ง ๋ฐ๋ก ํ์๋ฅผ ํ๋ค.
- ํฉ์นํ์ฌ ๋์ฐฉ์ง๊น์ง ๊ฐ๋ ๊ฒ์ด ์ต์ ๋น์ฉ์ธ๊ฐ? ๋ฐ๋ก ํ์๋ฅผ ํ์ ๋์ฐฉ์ง๊น์ง ๊ฐ๋ ๊ฒ์ด ์ต์ ๋น์ฉ์ธ๊ฐ?
[์๊ฐ์ ๊ณผ์ ]
- ์ฒ์์ ํฉ์นํ์ฌ ๋์ฐฉ์ง๊น์ง ๊ฐ๋ ๊ฒ๊ณผ // ๋ฐ๋ก ํ์๋ฅผ ํ์ ๋์ฐฉ์ง๊น์ง ๋์ฐฉํ๋ ๋น์ฉ(ํฉ์นํ์ง ์๋ ๊ฒฝ์ฐ)์ ๊ตฌ๋ถํ์ฌ ์๊ฐํ๋ ค ํ์์ต๋๋ค.
- ๊ทธ๋ฌ๋ ์ด๋ ์ง์ ๊น์ง ํฉ์นํ์๋์ง๋ฅผ ๋ตํ๋ ๊ณณ์ ์์ต๋๋ค.
- ์ด๋ ์ถ๋ฐ์ ์์ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต์ ์๊ธ์ ๊ตฌํ ๋ค ์์์ ํฉ์น ์ง์ ์ ์ ํํ์ฌ ๋ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต์ ๋น์ฉ์ ๋ํด์ค๋ ๋๋ค๋ ๋ป์ ๋๋ค.
- ์ฆ, ๋ฌธ์ ์ ํต์ฌ์ ๊ฐ ์ง์ ์์ ๋ค๋ฅธ ์ง์ ์ผ๋ก์ '์ต์ ๋น์ฉ'์ ๊ตฌํ ์ ์๋์ง์ ์ฌ๋ถ์์ต๋๋ค.
- ์ต์ ๋น์ฉ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์๋ ๋ค์ต์คํธ๋ผ์ ํ๋ก์ด๋ ์์ฌ์ด ๋ํ์ ์ ๋๋ค.
- ์ง์ ์ ๊ฐ์๊ฐ 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