๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ฏ | ๋ฐฑ์ค€/๐Ÿ™‚ | Silver

[Kotlin, S1] ๋ฐฑ์ค€ 1991๋ฒˆ ํŠธ๋ฆฌ ์ˆœํšŒ

by immgga 2024. 8. 21.

์ถœ์ฒ˜: unsplash.com

 

ํŠธ๋ฆฌ ์ˆœํšŒ(1991๋ฒˆ)

Silver 1

#ํŠธ๋ฆฌ #์žฌ๊ท€

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

 

๋ฌธ์ œ ๋‚ด์šฉ

 

 

๋ฌธ์ œ ์ ‘๊ทผ

์ž…๋ ฅ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ „์œ„, ์ค‘์œ„, ํ›„์œ„ ์ˆœํšŒ๋ฅผ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

ํŠธ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์ƒ์†Œํ•œ ์‚ฌ๋žŒ๋“ค์„ ํŠธ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€๋ถ€ํ„ฐ ๋‚œ๊ฐํ•  ๊ฒƒ์ด๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๋žฌ๋‹ค.

ํŠธ๋ฆฌ ๊ตฌ์„ฑ์€ ๋ฌธ์ œ ๋ณธ๋ฌธ์— ๋‚˜์™€ ์žˆ๋Š” ๊ฒƒ ๊ทธ๋Œ€๋กœ ๊ตฌ์„ฑํ•ด ๋ณผ ์ƒ๊ฐ์ด๋‹ค.

๋จผ์ € ํ•œ ๋…ธ๋“œ์˜ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•  Node ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•ด ์ค„ ๊ฒƒ์ด๋‹ค. node์—๋Š” value์™€ left, right ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค.

private data class Node(
    val value: String,
    var left: Node?,
    var right: Node?,
)

left์™€ right๋Š” ํ•˜์œ„ Node๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. nullable ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ ์ด์œ ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ(ํŠธ๋ฆฌ์˜ ๋)์—๋Š” ์ž์‹ ๋…ธ๋“œ์ธ left, right๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์œ„์™€ ๊ฐ™์ด data class๋ฅผ ๊ตฌํ˜„ํ•ด ์ฃผ๋ฉด ๋ฌธ์ œ ๋ณธ๋ฌธ์˜ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ Node๊ฐ€ ๋˜๋„๋ก ๊ตฌ์„ฑํ•ด ์ค„ ์ˆ˜ ์žˆ๊ณ , ํŠธ๋ฆฌ ๋ณ€์ˆ˜์˜ ํƒ€์ž…๋„ Node ํ•˜๋‚˜๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. List๋‚˜ Map์„ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋งŒํผ Node๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒŒ ์‰ฌ์šด ๊ฒŒ ์•„๋‹ˆ๋‹ค.

 

๋ฌธ์ œ์—์„œ ๋ฃจํŠธ ๋…ธ๋“œ๋Š” A๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, tree๋ฅผ ์ƒ์„ฑํ•ด ์ค€๋‹ค.

private val tree = Node("A", null, null)

์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด์„œ right์™€ left๋ฅผ ์ฑ„์›Œ์ฃผ๋ฉด ๋œ๋‹ค.

 

์ฑ„์šฐ๋Š” ๊ฒฝ์šฐ๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ tree์˜ value์™€ ์ผ์น˜ํ•  ๋•Œ๋งŒ ์ฑ„์›Œ ์ค˜์•ผ ํ•œ๋‹ค. ๋งˆ์นจํ‘œ๊ฐ€ ์ž…๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์ž˜ ์ฒดํฌํ•ด์•ผ ํ•œ๋‹ค.

์ด์ œ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์กฐ๊ฑด๋“ค์„ ์•Œ์•„๋ณด์ž.

์กฐ๊ฑด๋“ค์€ ์ž…๋ ฅ ์˜ˆ์ œ 1์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๋ช…ํ•œ๋‹ค.

7
A B C
B D .
C E F
E . .
F . G
D . .
G . .

 

 

<์กฐ๊ฑด 1>

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์˜ ๋…ธ๋“œ ๊ฐ’์ด Node์˜ value์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

private fun insertNode(tree: Node?, value: String, left: String, right: String) {
    if (tree?.value == value) ...
    
    ...
}

์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด ๋งŒ์•ฝ value๊ฐ€ A๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ, ํ˜„์žฌ tree์˜ value์ธ A์™€ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— A์™€ ๊ฐ™์ด ์ž…๋ ฅ๋œ B, C๋ฅผ ๊ฐ๊ฐ left, right์— ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.

๋งŒ์•ฝ ์ผ์น˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

 

 

<์กฐ๊ฑด 2>

ํ˜„์žฌ tree์—๋Š” value์—๋Š” ๋ฃจํŠธ A๊ฐ€ ์žˆ๊ณ , ํ•˜์œ„ Node๋“ค B, C๊ฐ€ ์žˆ๋‹ค. ์ด์ œ B์˜ ์ž์‹์„ ์ฒดํฌํ•ด์•ผ ํ•œ๋‹ค. ํ˜„์žฌ tree?.value๋Š” A๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด์„œ ์กฐ๊ฑด์ด ๋งž์ง€ ์•Š๋Š”๋‹ค.

์กฐ๊ฑด 1์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์กฐ๊ฑด 1์— ์ •์˜ํ•œ ์กฐ๊ฑด์—์„œ tree?.value๋ฅผ ์ˆ˜์ •ํ•ด ์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜๋‹ค ๋‹ค๋ฅธ ๊ฐ’๋“ค๋„ ์ž์‹ Node๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์„ ํ…Œ๋‹ˆ.

์กฐ๊ฑด์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์€ ํ˜„์žฌ Node์˜ left ๋˜๋Š” right๊ฐ€ null์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

if (tree?.left != null) insertNode(tree.left, value, left, right)
if (tree?.right != null) insertNode(tree.right, value, left, right)

ํ˜„์žฌ A ํ•˜์œ„์— B, C Node๊ฐ€ ์กด์žฌํ•˜๊ธฐ์— ์กฐ๊ฑด์ด ์„ฑ๋ฆฝ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ tree์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ํ˜„์žฌ tree.left๋กœ ๊ต์ฒดํ•˜๊ณ  ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ•œ๋‹ค. right๋„ ๋งˆ์ฐฌ๊ฐ€์ง€.

๊ทธ๋ ‡๊ฒŒ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ•˜๋ฉด ๋‹ค์‹œ ์กฐ๊ฑด 1๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ณด๊ฒŒ ๋˜๋Š”๋ฐ ํ™•์ธํ•  ๋…ธ๋“œ๋ฅผ A์˜ ํ•˜์œ„ ๋…ธ๋“œ๋กœ ์˜ฎ๊ฒจ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ–ˆ์œผ๋ฉด ๋‚˜๋จธ์ง€๋Š” ์‰ฝ๋‹ค.

 

ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ•˜๋ฉด์„œ ์ˆœํšŒํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

์ „์œ„ ์ˆœํšŒ๋ฅผ ์˜ˆ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ๋‹ค.

์ „์œ„ ์ˆœํšŒ ์ˆœ์„œ๊ฐ€ ๋ฃจํŠธ -> ์™ผ์ชฝ -> ์˜ค๋ฅธ์ชฝ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•ด ์ค€๋‹ค.

private fun frontTraversal(node: Node?) {
    if (node == null) return

    // ์ „์œ„ ์ˆœํšŒ: ๋ฃจํŠธ -> ์™ผ์ชฝ -> ์˜ค๋ฅธ์ชฝ.
    print(node.value)
    frontTraversal(node.left)
    frontTraversal(node.right)
}

๋จผ์ € ๋ฃจํŠธ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅ์„ ๋จผ์ € ์ง„ํ–‰ํ•˜๊ณ , ์™ผ์ชฝ์œผ๋กœ ๊ทธ๋‹ค์Œ์€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.

๋จผ์ € ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋Š”๋ฐ, ๋ฃจํŠธ ๋…ธ๋“œ๊นŒ์ง€ ๋๊นŒ์ง€ ์ง„ํ–‰ํ•˜๊ณ  null์ด ๋“ค์–ด์˜ค๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ฒŒ ๋œ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ํƒ์ƒ‰ ๊ณผ์ •์„ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

์‚ฌ์ง„ 1-1

1. ์šฐ์„  A๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด B, D์ˆœ์œผ๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.

2. D์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ Node๋Š” null์ด๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€๊ฐ€ ๋๋‚˜๊ณ  ๋‚จ์€ tree.right ์žฌ๊ท€๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

3. C๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋‹ค์‹œ tree.left ์žฌ๊ท€๋กœ ๋“ค์–ด๊ฐ€์„œ E๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  return ๋œ๋‹ค(๋‹ค์Œ Node๊ฐ€ null).

4. ๋‹ค์‹œ C์˜ tree.right ์žฌ๊ท€๋ฅผ ์ง„ํ–‰ํ•ด F, G๋กœ ์ง„ํ–‰๋œ๋‹ค(left๋Š” null์ด๋ผ ๋„˜์–ด๊ฐ).

 

๊ทธ๋ž˜์„œ ์ถœ๋ ฅ์ด ABDCEFG๊ฐ€ ๋œ๋‹ค.

์ค‘์œ„, ํ›„์œ„ ์ˆœํšŒ๋„ ์ „์œ„ ์ˆœํšŒ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์žฌ๊ท€๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.BufferedReader
import java.io.InputStreamReader

private val tree = Node("A", null, null)

private data class Node(
    val value: String,
    var left: Node?,
    var right: Node?,
)

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val case = readLine().toInt()

    for (i in 0 until case) {
        val (number, left, right) = readLine().split(" ")

        insertNode(tree, number, left, right)
    }

    frontTraversal(tree)
    println()

    middleTraversal(tree)
    println()

    endTraversal(tree)
}

private fun insertNode(tree: Node?, value: String, left: String, right: String) {
    if (tree?.value == value) {
        tree.left = if (left == ".") null else Node(left, null, null)
        tree.right = if (right == ".") null else Node(right, null, null)
    } else {
        if (tree?.left != null) insertNode(tree.left, value, left, right)
        if (tree?.right != null) insertNode(tree.right, value, left, right)
    }
}

private fun frontTraversal(node: Node?) {
    if (node == null) return

    // ์ „์œ„ ์ˆœํšŒ: ๋ฃจํŠธ -> ์™ผ์ชฝ -> ์˜ค๋ฅธ์ชฝ.
    print(node.value)
    frontTraversal(node.left)
    frontTraversal(node.right)
}

private fun middleTraversal(node: Node?) {
    if (node == null) return

    // ์ค‘์œ„ ์ˆœํšŒ: ์™ผ์ชฝ ์ž์‹ -> ๋ฃจํŠธ -> ์˜ค๋ฅธ์ชฝ ์ž์‹.
    middleTraversal(node.left)
    print(node.value)
    middleTraversal(node.right)
}

private fun endTraversal(node: Node?) {
    if (node == null) return

    // ํ›„์œ„ ์ˆœํšŒ: ์™ผ์ชฝ -> ์˜ค๋ฅธ์ชฝ -> ๋ฃจํŠธ.
    endTraversal(node.left)
    endTraversal(node.right)
    print(node.value)
}

 

๋ฌธ์ œ ํ’€์ด

Node data class๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ๊ณ  ์กฐ๊ฑด 1, ์กฐ๊ฑด 2๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ tree ๋ณ€์ˆ˜์— ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ด ์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ „์œ„ ์ˆœํšŒ, ์ค‘์œ„ ์ˆœํšŒ, ํ›„์œ„ ์ˆœํšŒ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ํž˜๋“ค๋‹ค.

์ฒ˜์Œ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋งŽ์ด ํ—ค๋งฌ ์ˆ˜ ์žˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๋žฌ๋‹ค.

๋‚˜๋Š” ํŠธ๋ฆฌ ๊ตฌ์„ฑ๋ถ€ํ„ฐ ๋ง‰ํ˜€์„œ ์ •๋‹ต์„ ์ฐธ๊ณ ํ•  ์ˆ˜๋ฐ–์— ์—†์—ˆ๋‹ค.

ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ €๋Ÿฐ ํ˜•์‹์„ ๋”ฐ๋ฅธ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ๊ฒ ๋‹ค.

 

์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ ๋งํฌ๋„ ๊ฑธ์–ด ๋†“๊ฒ ๋‹ค.

https://stdio-han.tistory.com/138

 

๋ฐฑ์ค€ 1991๋ฒˆ: ํŠธ๋ฆฌ ์ˆœํšŒ[JAVA]

https://www.acmicpc.net/problem/1991 1991๋ฒˆ: ํŠธ๋ฆฌ ์ˆœํšŒ ์ฒซ์งธ ์ค„์—๋Š” ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 26)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฐ ๋…ธ๋“œ์™€ ๊ทธ์˜ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ, ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€

stdio-han.tistory.com

 

728x90