๋ฌธ์
ํ์ด
1๏ธโฃ ์์์ ๋ ฌ์ ์ด์ฉํ ํ์ด
๐ก ๋ ์ค๋ฅธ Idea
์ผ๋จ ๋ถํ์ ์กฐ๋ฆฝ ์์๊ฐ ์์ผ๋ฏ๋ก ์์ ์ ๋ ฌ์ ์ฌ์ฉํด์ผํ๋ค๋ ๊ฒ์ ํ์ ํ๋ค.
๊ทผ๋ฐ, ์ํ๋ ์ถ๋ ฅ์ ์ต์ข ์ฅ๋๊ฐ์ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ๋ถํ์ ์๋ฅผ ์ถ๋ ฅํด์ผํ๋ค.
๊ธฐ๋ณธ ๋ถํ์ ์กฐํฉ๋์ด ๋ง๋ค์ด์ง ๋ถํ์ด ์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ถํ์ด๋ผ๊ณ ํ๋ค.
๋ฐ๋ผ์, ํน์ ๋ถํ์ ์กฐ๋ฆฝํ ๋๋ง๋ค ํด๋น ์กฐ๋ฆฝ ๋ถํ์ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ๋ถํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๊ณ์ ๋๊ฒจ์ฃผ์ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
์ผ๋จ, indegree ๊ฐ์ด 0 ์ธ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ถํ์ด๋ผ๊ณ ํ ์ ์๊ณ ๊ธฐ๋ณธ ๋ถํ์ ์๊ธฐ ์์ 1๊ฐ๋ก ์ด๋ฃจ์ด์ง๋ค.
์์ ๋ฅผ ์๋ฅผ ๋ค๋ฉด,
1๋ฒ ๋ถํ์
[๊ธฐ๋ณธ ๋ถํ 1: 1๊ฐ ] ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
5๋ฒ ๋ถํ์ 1๋ฒ ๋ถํ 2๊ฐ๊ฐ ํ์ํ๋ฏ๋ก
1๋ฒ ๋ถํ์ด ๊ฐ์ง ๋ชจ๋ ๊ธฐ๋ณธ ๋ถํ์ 2๋ฐฐ๊ฐ ํ์ํ๋ค.
๋ฐ๋ผ์, 5๋ฒ ๋ถํ์ ๊ฒฝ์ฐ
[๊ธฐ๋ณธ ๋ถํ 1 : 2๊ฐ] ๊ฐ ๋๋ค.
๊ทธ๋ฆฌ๊ณ 2๋ฒ ๋ถํ 2๊ฐ๋ ํ์ํ๋ฏ๋ก
5๋ฒ ๋ถํ์ ๊ฒฝ์ฐ
[๊ธฐ๋ณธ ๋ถํ 1 : 2๊ฐ , ๊ธฐ๋ณธ ๋ถํ 2 : 2๊ฐ] ๊ฐ ๋๋ค.
๋์ด์ 5๋ฒ ๋ถํ์ ๊ตฌ์ฑํ๋๋ฐ ํ์ํ ๋ถํ์ด ๋ ์์ผ๋ฏ๋ก ๋ง๋ฌด๋ฆฌ ๋๋ค.
์ด์ 7๋ฒ ๋ถํ์ ๊ฒฝ์ฐ 5๋ฒ ๋ถํ 2๊ฐ๊ฐ ํ์ํ๋ฏ๋ก
5๋ฒ ๋ถํ์ด ๊ฐ์ง ๋ชจ๋ ๊ธฐ๋ณธ ๋ถํ์ 2๋ฐฐ๊ฐ ํ์ํ๋ค.
๋ฐ๋ผ์,
7๋ฒ ๋ถํ์ ๊ฒฝ์ฐ
[๊ธฐ๋ณธ ๋ถํ 1 : 4๊ฐ, ๊ธฐ๋ณธ ๋ถํ 2 : 4๊ฐ] ๊ฐ ๋๋ค.
...
์ด๋ฐ ์์ผ๋ก ์์ ์ ๋ ฌ์ ์ํํ๋ฉด์
์ด์ ๋ถํ์ด ๊ฐ์ง ๊ธฐ๋ณธ ๋ถํ์ ์์ ํ์ํ ์ด์ ๋ถํ์ ์๋ฅผ ๊ณฑํ์ฌ ๋ค์ ๋ถํ์ ๊ธฐ๋ณธ ๋ถํ ๊ฐ์ ์ ๋ณด๋ฅผ ๋๊ธฐ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด
์ต์ข ๋ถํ์ ๊ธฐ๋ณธ ๋ถํ ์ ๋ณด๋ฅผ ํ์ ํ ์ ์๊ฒ ๋๋ค.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
int[] indegree = new int[N + 1];
Part[] parts = new Part[N + 1];
for (int i = 0; i <= N; i++) {
parts[i] = new Part(i);
}
for (int i = 0; i < M; i++) {
String[] input = br.readLine().split(" ");
int next = Integer.parseInt(input[0]);
int pre = Integer.parseInt(input[1]);
int numOfPre = Integer.parseInt(input[2]);
indegree[next]++;
parts[pre].nextParts.put(next, numOfPre);
}
Queue<Integer> q = new LinkedList<>();
for (int i = 1; i <= N; i++) {
if (indegree[i] == 0) {
q.offer(i);
// ๊ธฐ๋ณธ ๋ถํ์ ์ด๋ฃจ๋ ๊ธฐ๋ณธ ๋ถํ์ ์๊ธฐ ์์ 1๊ฐ
parts[i].defaultParts.put(i, 1);
}
}
// ์์์ ๋ ฌ
while (!q.isEmpty()) {
int idx = q.poll();
Part part = parts[idx];
for (int nextIdx : part.nextParts.keySet()) {
Part next = parts[nextIdx];
int numOfPrePart = part.nextParts.get(nextIdx);
// ์ด์ ๋ถํ์ ๊ธฐ๋ณธ ๋ถํ๋ค์ ๋ค์ ๋ถํ์ ๊ธฐ๋ก
for (int idxOfDefaultPart : part.defaultParts.keySet()) {
int numOfDefaultPart = part.defaultParts.get(idxOfDefaultPart);
next.defaultParts.put(idxOfDefaultPart, next.defaultParts.getOrDefault(idxOfDefaultPart, 0) + numOfPrePart * numOfDefaultPart);
}
// ๋ง์ฝ ์ด์ ๋ถํ์ด ๋ค ์ฒดํฌ๋์๋ค๋ฉด ํ์ ์ถ๊ฐ
indegree[nextIdx]--;
if (indegree[nextIdx] == 0) {
q.offer(nextIdx);
}
}
}
Part toy = parts[N];
List<int[]> ans = new ArrayList<>();
for (Integer defaultPart : toy.defaultParts.keySet()) {
ans.add(new int[]{defaultPart, toy.defaultParts.get(defaultPart)});
}
Collections.sort(ans, (a, b) -> a[0] - b[0]);
StringBuilder sb = new StringBuilder();
for (int[] info : ans) {
sb.append(info[0] + " " + info[1] + "\n");
}
System.out.println(sb);
}
static class Part {
int idx;
Map<Integer, Integer> nextParts = new HashMap<>();
Map<Integer, Integer> defaultParts = new HashMap<>();
public Part(int idx) {
this.idx = idx;
}
}
}
๊ฒฐ๊ณผ