๋ฌธ์ ๋งํฌ: https://school.programmers.co.kr/learn/courses/30/lessons/118669
2022 ์นด์นด์ค ์ธํด์ญ ๊ธฐ์ถ์ด๋ค.
์ถ์ ๊ตฌ์์ ์ถ๋ฐํ์ฌ ์ฐ๋ด์ฐ๋ฆฌ ํ ๊ณณ์ ์ฐ์ ๋ค ์๋์ ์ถ์ ๊ตฌ๋ก ๋์์์ผ ํ๋ค.
์ฃผ์ด์ง ๊ฐ์ ๋ค์ ๋ชจ๋ ์๋ฐฉํฅ์ด๊ธฐ ๋๋ฌธ์, ์ฐ๋ด์ฐ๋ฆฌ์ ์ฌ๋ผ๊ฐ ๋์ ์ฐ๋ด์ฐ๋ฆฌ์์ ๋ด๋ ค์ฌ ๋๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ , ํธ๋ ์ฝ์ค์ ์ต์ intensity๋ง ๊ตฌํด์ฃผ๋ฉด ๋๋ค. (์ฌ๋ผ๊ฐ ๋์ intensity) < (๋ด๋ ค์ฌ ๋์ intensity) ๋ผ๋ฉด, ์ฌ๋ผ๊ฐ ์ฝ์ค ๊ทธ๋๋ก ๋ด๋ ค์ค๋ ๊ฒ์ด ๋ ์ด๋์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ฌ๊ธฐ์๋ ์ฐ๋ด์ฐ๋ฆฌ๋ฅผ ์ถ๋ฐ์ ์ผ๋ก ์ก๊ณ , ๋ด๋ ค์ฌ ๋ ๊ธฐ์ค์ผ๋ก intensity๋ฅผ ๊ตฌํ๋ค.
์ถ๋ฐ์ ์์ ์ต์ intensity๋ฅผ ๊ฐ๋ ์ถ์
๊ตฌ ๋
ธ๋๋ฅผ ์ฐพ์์ผ ํ๊ณ , ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์กด์ฌํ๋ ์ํฉ์ด๋ฏ๋ก ๋ค์ต์คํธ๋ผ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ํ ์ ์๋ค.
์ผ๋ฐ์ ์ธ ๋ค์ต์คํธ๋ผ๋ ๊ฑฐ๋ฆฌ = (๊ฐ์ ๊ฐ์ค์น์ ๋์ ํฉ)์ด์ง๋ง, ์ฌ๊ธฐ์์ ๊ฑฐ๋ฆฌ๋ ๊ฐ์ ๊ฐ์ค์น์ ์ต๋๊ฐ์ด ๋๋ค.
1. Node ํด๋์ค ์ ์
class Node implements Comparable<Node> {
int idx;
int dist;
public Node(int idx, int dist) {
this.idx = idx;
this.dist = dist;
}
public int compareTo(Node o) {
return this.dist - o.dist;
}
}
๋จผ์ (๋ ธ๋ ๋ฒํธ, intensity์ ์ต๋๊ฐ)์ ์ ์ฅํ๋ Node ํด๋์ค๋ฅผ ์ ์ธํด์ฃผ์๋ค. PriorityQueue
2. ์ถ๋ฐ์ ๊ธฐ์ค์ผ๋ก ๋ค์ต์คํธ๋ผ ์คํํ๊ธฐ
๊ฐ ์ฐ๋ด์ฐ๋ฆฌ๋ฅผ ์ถ๋ฐ์ ์ผ๋ก ์ผ์, ๋ค์ต์คํธ๋ผ๋ฅผ ์คํํ๋ค.
Priority Queue๋ฅผ ์ด์ฉํด intensity๊ฐ ์ต์์ธ ๋
ธ๋๋ฅผ ์ฐ์ ํ์ํ์ผ๋ฏ๋ก, ์ถ์
๊ตฌ์ ๋์ฐฉํ๋ฉด ํด๋น ์ฝ์ค๊ฐ ์ต์ intensity๋ฅผ ๊ฐ๋ ์ฝ์ค๊ฐ ๋๋ค.
int N; // N = n
// graph[i]: i๋ฒ ๋
ธ๋์์ ๊ฐ ์ ์๋ ๋
ธ๋์ ๋ฒํธ๋ฅผ ์ ์ฅํ๋ List
// isGate[i]: i๋ฒ ๋
ธ๋๊ฐ ์ถ์
๊ตฌ ๋
ธ๋๋ฉด true
// isSummit[i]: i๋ฒ ๋
ธ๋๊ฐ ์ฐ๋ด์ฐ๋ฆฌ ๋
ธ๋๋ฉด true
List<Node>[] graph;
boolean[] isGate, isSummit;
int findCourse(int start) {
// ์์ ๋
ธ๋ ๊ธฐ์ค์ผ๋ก, i๋ฒ ๋
ธ๋๊น์ง ๊ฐ๋ ์ฝ์ค์ ๊ฑฐ๋ฆฌ(=intensity ์ค ์ต๋๊ฐ) ์ ์ฅ
int[] intensity = new int[N+1];
Arrays.fill(intensity, Integer.MAX_VALUE);
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(start, 0));
intensity[start] = 0;
while(!pq.isEmpty()) {
Node now = pq.poll();
// ์ถ์
๊ตฌ ๋
ธ๋์ ๋์ฐฉํ๋ฉด ํ์ฐ ์ข
๋ฃ -> ์ง๋์จ ๊ฐ์ ์ ๊ฐ์ค์น ์ค ์ต๋๊ฐ ๋ฐํ
if(isGate[now.idx]) return now.dist;
// ์ถ๋ฐ์ ์ ์ ์ธํ ๋ค๋ฅธ ์ฐ๋ด์ฐ๋ฆฌ ๋
ธ๋๋ ๋ฐฉ๋ฌธ ๋ถ๊ฐํ๋ฏ๋ก skip
if(now.idx!=start && isSummit[now.idx]) continue;
for (Node next : graph[now.idx]) {
int nextIntensity = Math.max(now.dist, next.dist);
if(intensity[next.idx] <= nextIntensity) continue;
pq.add(new Node(next.idx, nextIntensity));
intensity[next.idx] = nextIntensity;
}
}
// ์ถ์
๊ตฌ๊น์ง ๊ฐ๋ ๊ธธ์ด ์๋ ์ฐ๋ด์ฐ๋ฆฌ์ธ ๊ฒฝ์ฐ MAX_VALUE๋ฅผ ๋ฐํํ์ฌ ๋ต์ด ๋๋ ๊ฒ์ ๋ฐฉ์ง
return Integer.MAX_VALUE;
}
3. ์ ์ฒด ์ฝ๋
import java.util.*;
class Node implements Comparable<Node> {
int idx;
int dist;
public Node(int idx, int dist) {
this.idx = idx;
this.dist = dist;
}
public int compareTo(Node o) {
return this.dist - o.dist;
}
}
class Solution {
int N;
List<Node>[] graph;
boolean[] isGate, isSummit;
public int[] solution(int n, int[][] paths, int[] gates, int[] summits) {
int[] answer = new int[2];
N = n;
graph = new ArrayList[N+1];
isGate = new boolean[N+1];
isSummit = new boolean[N+1];
Arrays.sort(summits);
for (int i=1; i<=N; i++) {
graph[i] = new ArrayList<>();
}
for (int i=0; i<gates.length; i++) {
isGate[gates[i]] = true;
}
for (int i=0; i<summits.length; i++) {
isSummit[summits[i]] = true;
}
for (int i=0; i<paths.length; i++) {
int a = paths[i][0];
int b = paths[i][1];
graph[a].add(new Node(b, paths[i][2]));
graph[b].add(new Node(a, paths[i][2]));
}
int minIntensity = Integer.MAX_VALUE;
int summitIdx = 0;
for (int i=0; i<summits.length; i++) {
int intensity = findCourse(summits[i]);
if(minIntensity > intensity) {
minIntensity = intensity;
summitIdx = summits[i];
}
}
answer[0] = summitIdx;
answer[1] = minIntensity;
return answer;
}
int findCourse(int start) {
int[] intensity = new int[N+1];
Arrays.fill(intensity, Integer.MAX_VALUE);
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(start, 0));
intensity[start] = 0;
while(!pq.isEmpty()) {
Node now = pq.poll();
if(isGate[now.idx]) return now.dist;
if(now.idx!=start && isSummit[now.idx]) continue;
for (Node next : graph[now.idx]) {
int nextIntensity = Math.max(now.dist, next.dist);
if(intensity[next.idx] <= nextIntensity) continue;
pq.add(new Node(next.idx, nextIntensity));
intensity[next.idx] = nextIntensity;
}
}
return Integer.MAX_VALUE;
}
}
'๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๋๋์ง ์๊ฐ์ด๊ณผ ํด๊ฒฐ ํ๊ธฐ (0) | 2024.02.21 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ฒฝ์ฌ๋ก์ ๊ฐ์ (0) | 2023.11.12 |
[ํ๋ก๊ทธ๋๋จธ์ค] ํ ๋ณํฉ (0) | 2023.09.10 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์๊ณผ ๋๋ (0) | 2023.09.07 |
[๋ฐฑ์ค 5052] ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2023.09.04 |