๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

๋ฐฑ์ค€ - [BOJ 22856] ํŠธ๋ฆฌ ์ˆœํšŒ

by ๐Ÿณ Laboon 2024. 7. 8.

๋ฌธ์ œ

๋…ธ๋“œ๊ฐ€ ๊ฐœ์ธ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„ ์ˆœํšŒ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ˆœํšŒํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋ฅผ ์œ ์‚ฌ ์ค‘์œ„ ์ˆœํšŒ๋ผ๊ณ  ํ•˜์ž.

์ˆœํšŒ์˜ ์‹œ์ž‘์€ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ์ด๊ณ  ์ˆœํšŒ์˜ ๋์€ ์ค‘์œ„ ์ˆœํšŒํ•  ๋•Œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์ด๋‹ค. ์ด๋•Œ ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ 1๋ฒˆ ๋…ธ๋“œ์ด๋‹ค.

์œ ์‚ฌ ์ค‘์œ„ ์ˆœํšŒ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋œ๋‹ค.

  1. ํ˜„์žฌ ์œ„์น˜ํ•œ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๋กœ ์ด๋™ํ•œ๋‹ค.
  2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ํ˜„์žฌ ์œ„์น˜ํ•œ ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๋กœ ์ด๋™ํ•œ๋‹ค.
  3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์œ ์‚ฌ ์ค‘์œ„ ์ˆœํšŒ์˜ ๋์ด๋ผ๋ฉด, ์œ ์‚ฌ ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.
  4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ์ด๋™ํ•œ๋‹ค.
  5. ์œ ์‚ฌ ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ 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 ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.