Post

๐Ÿงฉ Baekjoon 1068 - ํŠธ๋ฆฌ

๐Ÿงฉ Baekjoon 1068 - ํŠธ๋ฆฌ

๋ฌธ์ œ

ํŠธ๋ฆฌ์—์„œย ๋ฆฌํ”„ย ๋…ธ๋“œ๋ž€,ย ์ž์‹์˜ย ๊ฐœ์ˆ˜๊ฐ€ย 0์ธย ๋…ธ๋“œ๋ฅผย ๋งํ•œ๋‹ค.ย  ํŠธ๋ฆฌ๊ฐ€ย ์ฃผ์–ด์กŒ์„ย ๋•Œ,ย ๋…ธ๋“œย ํ•˜๋‚˜๋ฅผย ์ง€์šธย ๊ฒƒ์ด๋‹ค.ย  ๊ทธย ๋•Œ,ย ๋‚จ์€ย ํŠธ๋ฆฌ์—์„œย ๋ฆฌํ”„ย ๋…ธ๋“œ์˜ย ๊ฐœ์ˆ˜๋ฅผย ๊ตฌํ•˜๋Š”ย ํ”„๋กœ๊ทธ๋žจ์„ย ์ž‘์„ฑํ•˜์‹œ์˜ค.ย  ๋…ธ๋“œ๋ฅผย ์ง€์šฐ๋ฉดย ๊ทธย ๋…ธ๋“œ์™€ย ๋…ธ๋“œ์˜ย ๋ชจ๋“ ย ์ž์†์ดย ํŠธ๋ฆฌ์—์„œย ์ œ๊ฑฐ๋œ๋‹ค.ย  ์˜ˆ๋ฅผย ๋“ค์–ด,ย ๋‹ค์Œ๊ณผย ๊ฐ™์€ย ํŠธ๋ฆฌ๊ฐ€ย ์žˆ๋‹ค๊ณ ย ํ•˜์ž. ํ˜„์žฌย ๋ฆฌํ”„ย ๋…ธ๋“œ์˜ย ๊ฐœ์ˆ˜๋Š”ย 3๊ฐœ์ด๋‹ค.ย (์ดˆ๋ก์ƒ‰ย ์ƒ‰์น ๋œย ๋…ธ๋“œ)ย ์ด๋•Œ,ย 1๋ฒˆ์„ย ์ง€์šฐ๋ฉด,ย ๋‹ค์Œ๊ณผย ๊ฐ™์ดย ๋ณ€ํ•œ๋‹ค.ย  ๊ฒ€์ •์ƒ‰์œผ๋กœย ์ƒ‰์น ๋œย ๋…ธ๋“œ๊ฐ€ย ํŠธ๋ฆฌ์—์„œย ์ œ๊ฑฐ๋œย ๋…ธ๋“œ์ด๋‹ค. ์ด์ œย ๋ฆฌํ”„ย ๋…ธ๋“œ์˜ย ๊ฐœ์ˆ˜๋Š”ย 1๊ฐœ์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” 0๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ N-1๋ฒˆ ๋…ธ๋“œ๊นŒ์ง€, ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋งŒ์•ฝ ๋ถ€๋ชจ๊ฐ€ ์—†๋‹ค๋ฉด (๋ฃจํŠธ) -1์ด ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„์—๋Š” ์ง€์šธ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ํŠธ๋ฆฌ์—์„œ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋ฅผ ์ง€์› ์„ ๋•Œ, ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ

โœ… ์ž…๋ ฅ 1

1
2
3
5 
-1 0 0 1 1 
2

โœ… ์ถœ๋ ฅ 1

1
2

โœ… ์ž…๋ ฅ 2

1
2
3
5 
-1 0 0 1 1 
1

โœ… ์ถœ๋ ฅ 2

1
1

โœ… ์ž…๋ ฅ 3

1
2
3
5 
-1 0 0 1 1 
0

โœ… ์ถœ๋ ฅ 3

1
0

โœ… ์ž…๋ ฅ 4

1
2
3
9 
-1 0 0 2 2 4 4 6 6 
4

โœ… ์ถœ๋ ฅ 4

1
2

์ž‘์„ฑ ์ฝ”๋“œ

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
60
61
62
63
64
65
66
67
68
69
70
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
	// ์ „์—ญ ๋ณ€์ˆ˜
	static Map<Integer, List<Integer>> tree;
	static int remove;
	
	/**
	 * ๋ฉ”์ธ ๋ฉ”์„œ๋“œ
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		// 1. ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int[] data = Arrays.stream(br.readLine().split("\\s+"))
			.mapToInt(Integer::parseInt)
			.toArray();
		remove = Integer.parseInt(br.readLine());
		int root = -1;
		
		// 2. ํŠธ๋ฆฌ ์ƒ์„ฑ
		tree = new HashMap<>();
		for (int i = 0; i < n; i++) {
			// ๋ฃจํŠธ ์ถ”์ถœ
			if (data[i] == -1) {
				root = i;
				continue;
			}
			
			// ํŠธ๋ฆฌ ์ƒ์„ฑ ์ฒ˜๋ฆฌ
			tree.putIfAbsent(data[i], new ArrayList<>());
			tree.get(data[i]).add(i);
		}
		
		// 3. ๋…ธ๋“œ ์‚ญ์ œ
		if (data[remove] != -1 && tree.containsKey(data[remove])) {
			tree.get(data[remove]).remove((Integer) remove);
		}
		
		// 4. ์ถœ๋ ฅ
		System.out.println((remove == root) ? 0 : dfs(root));
	}
	
	/**
	 * DFS ์ฒ˜๋ฆฌ
	 * @param node
	 * @return
	 */
	private static int dfs(int node) {
		// 1. ์‚ญ์ œ ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ
		if (node == remove) return 0;
		
		// 2. ๋ฆฌํ”„ ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ
		if (!tree.containsKey(node) || tree.get(node).isEmpty()) return 1;
		
		// 3. DFS ์ฒ˜๋ฆฌ
		int count = 0;
		for (int child : tree.get(node)) {
			count += dfs(child);
		}
		
		// 4. ๋ฐ˜ํ™˜
		return count;
	}
}
  • HashMap์„ ํ†ตํ•ด ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค.
  • ์˜ˆ์ œ๋งŒ ์ƒ๊ฐํ•˜๋ฉด ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค.
  • -1์ด ๋งจ ์•ž์— ๋‚˜์˜ฌ ๊ฒƒ์ฒ˜๋Ÿผ ๋˜์–ด ์žˆ์ง€๋งŒ ์‹ค์ œ ์ผ€์ด์Šค์—์„œ๋Š” ๋’ค์—์„œ๋„ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

ํšŒ๊ณ 

  • ๋ฉ”๋ชจ๋ฆฌย  ์ธก๋ฉด์—์„œ ์œ„์™€ ๊ฐ™์ด ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
This post is licensed under CC BY 4.0 by the author.