Tags
- ๋ฐฑํธ๋ํน
- queue
- ๋๋น ์ฐ์ ํ์
- ๊ทธ๋ํ ํ์
- BFS
- DP
- stack
- CodingTest
- ๊ต์ฌ
- ์๋ฎฌ๋ ์ด์
- sort
- Dynamic Programming
- greedy
- BOJ
- ๊ตฌํ
- Study
- ์ํ
- dfs
- Java
- Brute Force Algorithm
- Python
- LV2
- ์ ์๋ก
- PGM
- ์ ๋ ฌ
- ๊น์ด ์ฐ์ ํ์
- SpringBoot
- ๋ฌธ์์ด
- ์๋ฃ๊ตฌ์กฐ
- ๊ทธ๋ํ ์ด๋ก
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_1948 : ์๊ณ๊ฒฝ๋ก ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- N๊ฐ์ ๋์ ์ฌ์ด M๊ฐ์ ๋๋ก๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ๋๋ก๋ฅผ ๊ฑด๋๋ ์๊ฐ์ด ์๊ณ , ์ถ๋ฐ์ง์ ๋์ฐฉ์ง๊ฐ ์ฃผ์ด์ง๋ค.
- ๋๋ก๋ ์ถ๋ฐ์ง๋ถํฐ ๋์ฐฉ์ง๊น์ง ๋จ๋ฐฉํฅ ๋น์ํ ๊ทธ๋ํ์ด๋ค.
- ๋ง์ ๊ฒฝ๋ก ์ค์ ๊ฐ์ฅ ๋ฆ๊ฒ ๋์ฐฉํ๋ ๊ฒฝ๋ก์์ ์ง๋๋ ๋๋ก์ ์ ์ดํฉ์ ์ถ๋ ฅํ๋ค.
๐ธ ๋ฌธ์ ํ์ด ๐ธ
- ์ถ๋ฐ์ง๋ถํฐ ๋์ฐฉ์ง๊น์ง ๋จ๋ฐฉํฅ ๋น์ํ ๊ทธ๋ํ์ด๋ฏ๋ก, ์์ ์ ๋ ฌ(Topology Sort)์ ํตํด ์ต๋๊ฐ์ ๊ตฌํ ์ ์๋ค.
- ๊ฑด๋์จ ๊ฒฝ๋ก์ ์๋ฅผ ์นด์ดํธ ํด์ผํ๋ฏ๋ก ์ญ๋ฐฉํฅ ํ์์ด ํ์ํ๋ค.
- 1๋ถ๋ ์ฌ์ง ์๊ณ ๋ฌ๋ฆฐ ๊ฒฝ๋ก์ด๋ฏ๋ก ํ์ฌ ์๊ฐ๊ณผ ๋๋ก์ ์์ ์๊ฐ์ ์ฐจ์ด๊ฐ ๋ง์ ๋จ์ด์ ธ์ผ ํ๋ค.
- ๊ฒฝ๋ก๋ฅผ ์ค๋ณต๋๊ฒ ์ฒดํฌํ์ง ์๊ธฐ ์ํด์ ๋์๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ๋ค.
๐ธ ์ฝ๋ ๐ธ
import java.io.*;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
int[] indegree = new int[n + 1];
ArrayList<ArrayList<Edge>> adjList = new ArrayList<>();
ArrayList<ArrayList<Edge>> adjList_reverse = new ArrayList<>();
for (int i = 0; i <= n; i++) {
adjList.add(new ArrayList<>());
adjList_reverse.add(new ArrayList<>());
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int out = Integer.parseInt(st.nextToken());
int in = Integer.parseInt(st.nextToken());
int time = Integer.parseInt(st.nextToken());
adjList.get(out).add(new Edge(in, time));
adjList_reverse.get(in).add(new Edge(out, time));
indegree[in]++;
}
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
// ์์ ์ ๋ ฌ
int[] critical_path = new int[n + 1]; // ๊ฑธ๋ฆฐ ์๊ฐ์ ์ต๋๊ฐ
Queue<Integer> que = new ArrayDeque<>();
que.offer(start);
while (!que.isEmpty()) {
int now = que.poll();
for (Edge next : adjList.get(now)) {
critical_path[next.v] = Math.max(critical_path[next.v], critical_path[now] + next.time);
if (--indegree[next.v] == 0) {
que.offer(next.v);
}
}
}
// ์ญ๋ฐฉํฅ ์์ ์ ๋ ฌ
boolean[] visited = new boolean[n + 1];
que.offer(end);
int cnt = 0;
while (!que.isEmpty()) {
int now = que.poll();
for (Edge next : adjList_reverse.get(now)) {
if (critical_path[now] == critical_path[next.v] + next.time) {
cnt++;
if (!visited[next.v]) {
que.offer(next.v);
visited[next.v] = true;
}
}
}
}
sb.append(critical_path[end]).append('\n').append(cnt);
bw.write(sb.toString());
bw.flush();
}
private static class Edge {
int v;
int time;
public Edge(int v, int time) {
this.v = v;
this.time = time;
}
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- ์ง์ ์ฐจ์ intํ ๋ฐฐ์ด indegree, ์ธ์ ๋ฆฌ์คํธ adjList์ ์ญ๋ฐฉํฅ ์ธ์ ๋ฆฌ์คํธ adjList_reverse๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
- ๋จผ์ ์์ ์ ๋ ฌ์ ํตํด ๊ฐ ๋์์ ๋์ฐฉํ๋ ์ต๋ ์๊ฐ(์๊ณ ๊ฒฝ๋ก)๋ฅผ ๊ตฌํ๋ค.
- ํ์ฌ ๋์์์ ๋ค์ ๋์๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ๋ ํฐ ๊ฐ์ด๋ฉด ์ ๋ฐ์ดํธ (DP ๋๋)
- ๋ค์ ๋์์ ์ง์ ์ฐจ์๋ฅผ -1 ํด์ฃผ๊ณ , ๋ง์ฝ 0์ด ๋์๋ค๋ฉด ๊ฒฝ๋ก๋ฅผ ํ์ธํ๊ธฐ ์ํด ํ์ ๋ฃ๋๋ค.
- ์ต์ข ๋์ฐฉ์ง์ ์๊ณ ๊ฒฝ๋ก ๊ฐ์ด ๋์ฐฉ๊น์ง ๊ฑธ๋ฆฌ๋ ์ต๋ ์๊ฐ์ด๋ค.
- ์ญ๋ฐฉํฅ ์์ ์ ๋ ฌ์ ํตํด ๊ฑด๋์จ ๊ฐ์ ์ ์๋ฅผ ์นด์ดํธํ๋ค.
- ์๋ฐฉํฅ ์์ ์ ๋ ฌ๊ณผ ๋ค๋ฅธ ์ ์, 1๋ถ๋ ๊ธฐ๋ค๋ ค์๋ ์๋๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ ํํ ์ผ์นํด์ผ ํ๋ค.
(๋ค์ ๋์๋ก ๊ฐ๋ ์๊ฐ + ๋ค์ ๋์ ์๊ณ ๊ฒฝ๋ก๊ฐ = ํ์ฌ ๋์ ์๊ณ ๊ฒฝ๋ก๊ฐ) - ์ผ์นํ๋ค๋ฉด, ํด๋น ๊ฒฝ๋ก๊ฐ ์ง๋์จ ๊ธธ์ด๋ฏ๋ก cnt+1
- ์ค๋ณต์ ํผํ๊ธฐ ์ํด ๋ฐฉ๋ฌธ ์ฒดํฌ๋ก 1๋ฒ๋ง ๋ค์ ๋์๋ฅผ ํ์ ๋ฃ๋๋ค.
- ์ด ์นด์ดํธ ๋ cnt ๊ฐ์ด ์ง๋์จ ๊ฒฝ๋ก์ ์ดํฉ์ด๋ค.
- ์๋ฐฉํฅ ์์ ์ ๋ ฌ๊ณผ ๋ค๋ฅธ ์ ์, 1๋ถ๋ ๊ธฐ๋ค๋ ค์๋ ์๋๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ ํํ ์ผ์นํด์ผ ํ๋ค.
๐ธ end ๐ธ
- ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํ๋ฉฐ ์ต์ข ์ผ๋ก ํ์ด๋ณธ ์ด๋ ค์ด ๋ฌธ์ ์ธ๋ฐ...๋๋ฌด ์ด๋ ค์ ๋ค.
- 3์๊ฐ์ ์ก๊ณ ์๋ ๊ฒ ๊ฐ์๋ฐ, ์์ ์ ๋ ฌ์ ์๋ฒฝํ ์ดํดํ๊ณ , ๊ทธ๋ํ ๋ฌธ์ ์์ ์ข ์ข ๋์ค๋ ์ญ๋ฐฉํฅ ํ์๊น์ง ํ์๋ก ํ๋ค.
- ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋จํ๋ค๊ณ ์๊ฐํ๋๋ฐ, ํ์ฉ ์์ญ์ด ๋๋ฌด ๋ค์ํด์ ์์ง ํ์ฐธ ์ฐ์ต์ด ํ์ํ ๊ฒ ๊ฐ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_1854 : K๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก ์ฐพ๊ธฐ (0) | 2024.09.26 |
---|---|
BOJ_1516 : ๊ฒ์ ๊ฐ๋ฐ (0) | 2024.09.12 |
BOJ_1113 : ์์์ฅ ๋ง๋ค๊ธฐ (0) | 2024.08.20 |
BOJ_15989 : 1, 2, 3 ๋ํ๊ธฐ 4 (0) | 2024.08.16 |
Lv.3 : ๊ณ ๊ณ ํ ์ต๊ณ ์ ๋ฐ๊ฒฌ (0) | 2024.08.15 |