๋ฌธ์
๋ ธ๋๊ฐ ๊ฐ ์๋ค. ํธ๋ฆฌ๋ฅผ ์ค์ ์ํ์ ์ ์ฌํ๊ฒ ์ํํ๋ ค๊ณ ํ๋ค. ์ด๋ฅผ ๊ฐ์ธ ์ด์ง ํธ๋ฆฌ ์ ์ฌ ์ค์ ์ํ๋ผ๊ณ ํ์.
์ํ์ ์์์ ํธ๋ฆฌ์ ๋ฃจํธ์ด๊ณ ์ํ์ ๋์ ์ค์ ์ํํ ๋ ๋ง์ง๋ง ๋ ธ๋์ด๋ค. ์ด๋ ๋ฃจํธ ๋ ธ๋๋ ํญ์ 1๋ฒ ๋ ธ๋์ด๋ค.
์ ์ฌ ์ค์ ์ํ๋ ๋ฃจํธ ๋ ธ๋์์ ์์ํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ด ์งํ๋๋ค.
- ํ์ฌ ์์นํ ๋ ธ๋์ ์ผ์ชฝ ์์ ๋ ธ๋๊ฐ ์กด์ฌํ๊ณ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด, ์ผ์ชฝ ์์ ๋ ธ๋๋ก ์ด๋ํ๋ค.
- ๊ทธ๋ ์ง ์๊ณ ํ์ฌ ์์นํ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๊ฐ ์กด์ฌํ๊ณ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด, ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๋ก ์ด๋ํ๋ค.
- ๊ทธ๋ ์ง ์๊ณ ํ์ฌ ๋ ธ๋๊ฐ ์ ์ฌ ์ค์ ์ํ์ ๋์ด๋ผ๋ฉด, ์ ์ฌ ์ค์ ์ํ๋ฅผ ์ข ๋ฃํ๋ค.
- ๊ทธ๋ ์ง ์๊ณ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์กด์ฌํ๋ค๋ฉด, ๋ถ๋ชจ ๋ ธ๋๋ก ์ด๋ํ๋ค.
- ์ ์ฌ ์ค์ ์ํ๋ฅผ ์ข ๋ฃํ ๋๊น์ง 1 ~ 4๋ฅผ ๋ฐ๋ณตํ๋ค.

์ ๊ทธ๋ฆผ์ ์๋ ํธ๋ฆฌ์์ ์ค์ ์ํ๋ฅผ ํ๋ค๋ฉด 4→2→5→1→6→3→7 ์์ผ๋ก ์ํ๋ฅผ ํ๋ค.
๋ฐ๋ผ์, ์ ์ฌ ์ค์ ์ํ์ ๋์ ๋ ธ๋ 7์ด ๋๋ค.
์ ์ฌ ์ค์ ์ํ๋ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ฃจํธ์ธ ๋ ธ๋ 1์์ ์์ํ์ฌ ๋ ธ๋ 7์์ ๋๋๊ณ 1→2→4→2→5→2→1→3→6→3→7 ์ด์ ๊ฐ์ ์์๋ก ์ํ๋ฅผ ์งํํ๋ค. ์ ์ฌ ์ค์ ์ํ๋ฅผ ์งํํ๋ฉด์ ์ด 10๋ฒ ์ด๋ํ์๋ค.
์ฌ๊ธฐ์ ์ด๋์ด๋ผ๋ ๊ฒ์ ํ๋์ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ก ํ๋ฒ ์์ง์ด๋ ๊ฒ์ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค๋ฉด, ๋ ธ๋ 1์์ ๋ ธ๋ 2๋ก ๊ฐ๋ ๊ฒ์ ํ๋ฒ ์ด๋ํ์๋ค๊ณ ํ๋ค.
์ ์ฌ ์ค์ ์ํ๋ฅผ ํ๋ฉด์ ์ด๋ํ ํ์๋ฅผ ๊ตฌํ๋ ค๊ณ ํ๋ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋ ธ๋์ ๊ฐ์ ์ด ์ฃผ์ด์ง๋ค.
๋ ๋ฒ์งธ ์ค๋ถํฐ ๋ฒ์งธ ์ค๊น์ง ํ์ฌ ๋ ธ๋ ํ์ฌ ๋ ธ๋์ ์ผ์ชฝ ์์ ๋ ธ๋ , ํ์ฌ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ ๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ๋ง์ฝ ์์ ๋ ธ๋์ ๋ฒํธ๊ฐ -1์ธ ๊ฒฝ์ฐ ์์ ๋ ธ๋๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ถ๋ ฅ
์ ์ฌ ์ค์ ์ํ๋ฅผ ํ๋ฉด์ ์ด๋ํ ์ด ํ์๋ฅผ ์ถ๋ ฅํ๋ค.
ํด๋น ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด Tree ๋ฌธ์ ๋ผ๊ณ ์น์ ํ๊ฒ ์๋ ค์ฃผ๊ณ ์๋ค.
์ถ๊ฐ์ ์ผ๋ก, ์ค์์ํ์ ์ฐ๊ด๋ ๋ฌธ์ ๋ผ๊ณ ์น์ ํ๊ฒ ์๋ ค์ฃผ๊ณ ์๋ค.
โป ์ค์ ์์์ ํน์ฑ ๋งจ๋ง์ง๋ง ๋ ธ๋๋ ํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ๋งจ๋ง์ง๋ง ๋ ธ๋์ด๋ค.
์ด๋ฒ ๋ฌธ์ ๋ ์ด ํน์ฑ์ ๊ฐ์ง๊ณ ํ ๋ฒ ํด๊ฒฐํด๋ณด๋ ค๊ณ ํ๋ค.
private static void pseudoInorder(ArrayList<Node> tree, int node) throws IOException {
if (tree.get(node).left != -1) {
CNT++;
pseudoInorder(tree, tree.get(node).left);
CNT++;
}
if (tree.get(node).right != -1) {
CNT++;
pseudoInorder(tree, tree.get(node).right);
CNT++;
}
}
์ฐ์ ์ ์ฌ ์ค์ ์ํ๋ฅผ ํ๋ค. ์ผ์ชฝ ๋ ธ๋๋ก ์ด๋ํ๋ฉด์ Count++, ์ผ์ชฝ ๋ ธ๋์์ ๋์์ค๋ฉด์ Count++ ๋๋ ๋ก์ง์ ๊ทธ๋๋ก ์ ์ฉํ๋ค.
for (int i = 1; tree.get(i).right != -1; i=tree.get(i).right) {
RIGHT_NODE_COUNT++;
}
์ค๋ฅธ์ชฝ ๋งจ๋ง์ง๋ง ๋ ธ๋๋ก ์ด๋ํ๋ ํ์๋ฅผ ๊ตฌํด์ค๋ค.
BW.write(String.valueOf(CNT - RIGHT_NODE_COUNT));
์ ๋ ๊ฐ์ ๋นผ์ค๋ค.
๋
import java.io.*;
import java.util.*;
class Node {
int left;
int right;
public Node() {
}
}
public class Main {
static BufferedReader BR = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter BW = new BufferedWriter(new OutputStreamWriter(System.out));
static int N;
static int RIGHT_NODE_COUNT = 0;
static int CNT = 0;
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(BR.readLine());
N = Integer.parseInt(st.nextToken());
ArrayList<Node> tree = new ArrayList<>();
for (int i = 0; i <= N; i++) {
tree.add(new Node());
}
for (int i = 0; i < N; i++) {
st = new StringTokenizer(BR.readLine());
int node = Integer.parseInt(st.nextToken());
tree.get(node).left = Integer.parseInt(st.nextToken());
tree.get(node).right = Integer.parseInt(st.nextToken());
}
for (int i = 1; tree.get(i).right != -1; i=tree.get(i).right) {
RIGHT_NODE_COUNT++;
}
pseudoInorder(tree, 1);
BW.write(String.valueOf(CNT - RIGHT_NODE_COUNT));
BW.flush();
BR.close();
BW.close();
}
private static void pseudoInorder(ArrayList<Node> tree, int node) throws IOException {
if (tree.get(node).left != -1) {
CNT++;
pseudoInorder(tree, tree.get(node).left);
CNT++;
}
if (tree.get(node).right != -1) {
CNT++;
pseudoInorder(tree, tree.get(node).right);
CNT++;
}
}
}
TIP
package com.study.algorithm.boj22856;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static BufferedReader BR = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter BW = new BufferedWriter(new OutputStreamWriter(System.out));
static int N;
static int RIGHT_NODE_COUNT = 0;
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(BR.readLine());
N = Integer.parseInt(st.nextToken());
int tree[][] = new int[N+1][2];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(BR.readLine());
int node = Integer.parseInt(st.nextToken());
tree[node][0] = Integer.parseInt(st.nextToken());
tree[node][1] = Integer.parseInt(st.nextToken());
}
for (int i = 1; tree[i][1] != -1; i=tree[i][1]) {
RIGHT_NODE_COUNT++;
}
BW.write(String.valueOf((N - 1) * 2 - RIGHT_NODE_COUNT));
BW.flush();
BR.close();
BW.close();
}
}
Tree์ ํน์ฑ์ ์ด์ฉํ๋ฉด ๋ ์ฝ๋ค. Inorder๋ ๋ชจ๋ Node๋ฅผ ๋ค ๋ฐฉ๋ฌธํ๋ฏ๋ก Edge์ ๊ฐ์ (N-1) ๋งํผ ๋ฐ๋ณตํ๋ค.
Pseudo Inorder๋ฅผ ํ๋ฉด์ 2๋ฒ์ฉ ์งํํ๋ฏ๋ก (N - 1) * 2 ๋ฒ ์ฉ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ Inorder ๊ฒฐ๊ณผ์ธ ์ค๋ฅธ์ชฝ ๋ ธ๋๊น์ง์ ์ฃ์ง์๋ฅผ ๋นผ์ค๋ค.
๊ฒฐ๊ณผ : (N - 1) * 2 - RIGHT_NODE_COUNT ๋ก ๊ตฌํ ์ ์๋ค.
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ 1826] ์ฐ๋ฃ ์ฑ์ฐ๊ธฐ (0) | 2025.03.31 |
---|---|
[BOJ 20207] ๋ฌ๋ ฅ (0) | 2025.03.31 |
๋ฐฑ์ค - [BOJ 1865] ์ํ (0) | 2024.07.06 |
๋ฐฑ์ค - [BOJ 3085] ์ฌํ๊ฒ์ (0) | 2024.03.01 |
๋ฐฑ์ค - [BOJ 12094] A์ B (0) | 2024.02.29 |