๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/14267)
< ํ์ฌ ๋ฌธํ 1 >
๋ฌธ์ ํ์ด & ์๊ฐ
์ง์ ์์ฌ์ ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ์ผ๋ฏ๋ก ์ด ์ ๋ณด๋ฅผ ์ด์ฉํด์ ๊ฐ ์ง์์ ์ง์ ๋ถํ๋ฅผ ์ ์ฅํด ๋๋ค.
์ฒ์์๋ ์ง์ ๋ถํ ์ ๋ณด๋ฅผ ์ ์ฅํด ๋ ๊ฒ์ ์ด์ฉํด์ ๋ต์ ๊ตฌํ์ง๋ง ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ ์ด์ ๋ ์นญ์ฐฌ์ ๋ฐ์ ๋๋ง๋ค dfs ํจ์๋ฅผ ํธ์ถํด์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด ์นญ์ฐฌ์ ๋ค ์ ์ฅํ ํ dfs ํจ์๋ฅผ ํ ๋ฒ ํธ์ถํ์ฌ ๊ตฌํ๋๋ ํต๊ณผํ ์ ์์๋ค.
์๊ฐ์ด๊ณผ ์ฝ๋(Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main { // ํ์ฌ ๋ฌธํ 1
static int sup[];
static long answer[];
static ArrayList<ArrayList<Integer>> sub;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
sup = new int[n + 1];
answer = new long[n + 1];
sub = new ArrayList<>();
for (int i = 0; i <= n; i++) {
sub.add(new ArrayList<>());
}
st = new StringTokenizer(bf.readLine());
for (int i = 1; i <= n; i++) {
sup[i] = Integer.parseInt(st.nextToken());
if (sup[i] > -1)
sub.get(sup[i]).add(i);
}
for (int j = 0; j < m; j++) {
st = new StringTokenizer(bf.readLine());
int i = Integer.parseInt(st.nextToken()); // ์ง์ ๋ฒํธ
int w = Integer.parseInt(st.nextToken()); // ์นญ์ฐฌ์ ์์น
dfs(i, w);
}
for (int i = 1; i <= n; i++) {
bw.write(answer[i] + " ");
}
bw.flush();
}
private static void dfs(int idx, int w) {
answer[idx] += w;
for (int i = 0; i < sub.get(idx).size(); i++) {
dfs(sub.get(idx).get(i), w);
}
}
}
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class _14267_ { // ํ์ฌ ๋ฌธํ 1
static int sup[], answer[];
static boolean visited[];
static ArrayList<ArrayList<Integer>> sub;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
sup = new int[n + 1];
answer = new int[n + 1];
visited = new boolean[n + 1];
sub = new ArrayList<>();
for (int i = 0; i <= n; i++) {
sub.add(new ArrayList<>());
}
st = new StringTokenizer(bf.readLine());
for (int i = 1; i <= n; i++) {
sup[i] = Integer.parseInt(st.nextToken());
if (sup[i] > -1)
sub.get(sup[i]).add(i);
}
for (int j = 0; j < m; j++) {
st = new StringTokenizer(bf.readLine());
int i = Integer.parseInt(st.nextToken()); // ์ง์ ๋ฒํธ
int w = Integer.parseInt(st.nextToken()); // ์นญ์ฐฌ์ ์์น
answer[i] += w;
}
for(int i=1; i<=n; i++) {
if(answer[i]>0 && !visited[i]) {
visited[i]=true;
dfs(i);
}
}
for (int i = 1; i <= n; i++) {
bw.write(answer[i] + " ");
}
bw.flush();
}
private static void dfs(int idx) {
for (int i = 0; i < sub.get(idx).size(); i++) {
int next=sub.get(idx).get(i);
answer[next]+=answer[idx];
visited[next]=true;
dfs(next);
}
}
}
Main
- ํ์ฌ ์ง์์ ์ (n), ์ต์ด์ ์นญ์ฐฌ์ ํ์ (m) ์ ๋ ฅ
- sup : ์ง์ ์์ฌ์ ๋ฒํธ ์ ์ฅ
answer : ์นญ์ฐฌ๋ฐ์ ์ ๋ ์ ์ฅ
visited: ๋ฐฉ๋ฌธ ์ฌ๋ถ
sub : ์ง์ ๋ถํ์ ๋ฒํธ ์ ์ฅ
- ์ง์ ์์ฌ์ ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ์ผ๋ฉด์ ์ง์ ํ์ฌ์ ๋ฒํธ๋ฅผ ์ ์ฅ
- ์ง์ ๋ฒํธ(i), ์นญ์ฐฌ์ ์์น(w) ์ ๋ ฅ ํ answer์ ์นญ์ฐฌ ์์น ์ ์ฅ
- ์นญ์ฐฌ์ ๋ฐ์์ง๋ง ์์ง ์ง์ ๋ถํ์๊ฒ ์ ๋ฌ์ ์ ํ๋ค๋ฉด dfs ํจ์ ํธ์ถ
- answer ์ถ๋ ฅ
dfs
- ์ง์ ๋ถํ๊ฐ ์๋ค๋ฉด ์ง์ ๋ถํ์๊ฒ ์นญ์ฐฌ ์ ๋ฌ ํ dfs ํธ์ถ
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 17298_์คํฐ์ (0) | 2023.06.28 |
---|---|
[Baekjoon] 3425_๊ณ ์คํ (0) | 2023.06.27 |
[Baekjoon] 16562_์น๊ตฌ๋น (0) | 2023.06.27 |
[Baekjoon] 1043_๊ฑฐ์ง๋ง (0) | 2023.06.26 |
[Baekjoon] 12893_์ ์ ์ (0) | 2023.06.26 |