백준 온라인 저지/Gold

[BOJ] 16437 - 양 구출 작전

jooona 2022. 7. 30. 13:05
반응형

개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.

 

문제

https://www.acmicpc.net/problem/16437

 

16437번: 양 구출 작전

2, 3, 5번에 사는 모든 양들은 1번 섬으로 갈 수 있지만 7번 섬에 사는 양들은 1번 섬으로 가기 위하여 6번 섬을 거쳐야 하는데 6번 섬에 사는 늑대들의 수가 7번 섬에 사는 양들의 수보다 많으므로

www.acmicpc.net

난이도: 골드 3

사용언어: JAVA

 

풀이

이 문제는 트리 형태의 데이터 구조를 가진다는 점만 잘 이용하면 쉽게 해결할 수 있습니다.

 

트리의 순회 방법 중 후위 순회를 사용하면 트리의 Leaf Node부터 Root Node까지 차례로 올라오면서 남아있는 늑대의 수와 올라올 수 있는 양의 수를 쉽게 계산할 수 있습니다.

 

즉, DFS를 통해 Root Node인 1번 섬으로부터 출발하여 Leaf Node에 도달하면 해당 섬에 존재하는 양 또는 늑대의 수를 이용해 부모 노드에 반영시키는 형태로 구현을 했습니다. 해당 섬에 양이 존재하면 부모 노드로 올려줘서 부모 노드의 양 또는 늑대와 계산하면 되겠죠?

 

또한, 저는 각 섬에 대해 늑대의 수는 음수로 표현하고, 양의 수는 양수로 표현하여 계산을 쉽게 할 수 있도록 했습니다.

 

더 자세한 설명은 코드에 주석으로 첨부하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.util.*;
import java.io.*;
 
public class Main {
 
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static ArrayList<ArrayList<Integer>> list = new ArrayList<>(); // DFS를 위한 2차원 ArrayList
    static int N;
    static long[] animal_number_arr; // 각 섬에 남아있는 늑대 또는 양의 수 (늑대는 음수, 양은 양수로 표현)
 
    public static void dfs(int now, int parent) { // now: 현재 섬의 번호, parent: 현재 섬의 부모 노드 
        int next;
 
        for (int i = 0; i < list.get(now).size(); i++) { // 현재 섬의 자식 노드를 모두 탐색
            next = list.get(now).get(i);
 
            dfs(next, now); // 자식 노드로 DFS 수행
        }
 
        // 모든 자식 노드를 탐색한 뒤,
        if (animal_number_arr[now] > 0) { // 현재 섬이 양이 있는 섬이라면
            animal_number_arr[parent] += animal_number_arr[now]; // 부모 노드로 양을 보냄
        }
    }
 
    public static void main(String[] args) throws IOException {
 
        N = Integer.parseInt(br.readLine());
        animal_number_arr = new long[N + 1];
 
        for (int i = 0; i <= N; i++) {
            list.add(new ArrayList<>());
        }
 
        for (int i = 2; i < N + 1; i++) {
 
            StringTokenizer st = new StringTokenizer(br.readLine());
            char animal_char = st.nextToken().charAt(0); // 'S' or 'W'
            long count_of_animal = Integer.parseInt(st.nextToken()); // 양 또는 늑대의 수
            int parent = Integer.parseInt(st.nextToken()); // 부모 노드
 
            list.get(parent).add(i); 
            if (animal_char == 'S') { // 양이면 양수로 표현
                animal_number_arr[i] = count_of_animal;
            } else { // 늑대면 음수로 표현
                animal_number_arr[i] = count_of_animal * -1;
            }
        }
 
        dfs(10);
 
        bw.write(String.valueOf(animal_number_arr[1]));
        bw.flush();
        bw.close();
        br.close();
    }
}
 
cs

 

 

반응형

'백준 온라인 저지 > Gold' 카테고리의 다른 글

[BOJ] 2412 - 암벽 등반  (0) 2022.07.31
[BOJ] 5430 - AC  (0) 2022.02.09
[BOJ] 3078 - 좋은 친구  (0) 2022.02.03
[BOJ] 2116 - 주사위 쌓기  (0) 2022.01.31
[BOJ] 10423 - 전기가 부족해  (2) 2021.10.21