Skip to content

Conversation

@dohyeondol1
Copy link
Contributor

@dohyeondol1 dohyeondol1 commented Apr 8, 2025

πŸ”— 문제 링크

트리 순회

μ˜€λŠ˜μ€ 트리λ₯Ό κ³΅λΆ€ν–ˆκΈ° λ•Œλ¬Έμ—, 이λ₯Ό κ΅¬ν˜„ν•΄λ³Ό 수 μžˆλŠ” 문제λ₯Ό κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€.

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

15λΆ„

✨ μˆ˜λ„ μ½”λ“œ

κ°„λ‹¨ν•˜κ²Œ 트리 순회λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.
μ „μœ„ 순회, μ€‘μœ„ 순회, ν›„μœ„ 순회 μ„Έ κ°€μ§€λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ”λ°, νŠΈλ¦¬κ°€ 어렴풋이 λ­”μ§€λ§Œ μ•Œκ³ μžˆμ–΄λ„ κ·Έλ ‡κ²Œ μ–΄λ ΅μ§„ μ•ŠμŠ΅λ‹ˆλ‹€.
λ¬Έμ œμ—μ„œλ„ 예제 μž…λ ₯1에 λŒ€ν•œ μ„Έκ°€μ§€ 트리 순회의 κ²°κ³Όλ₯Ό μ•Œλ €μ£Όκ³  있죡..

각각의 순회λ₯Ό 그림으둜 ν‘œν˜„ν•΄ λ΄…μ‹œλ‹€.
λΆ€λͺ¨μ˜ λ°©λ¬Έ μ‹œμ μ„ κΈ°μ€€μœΌλ‘œ μš©μ–΄λ₯Ό 바라보면 더 μ‰½κ²Œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°œλ…μ€ μ΄μ •λ„λ‘œ μΆ©λΆ„ν•œ 것 κ°™μœΌλ‹ˆ,
제 풀이 μ„€λͺ…μœΌλ‘œ λ„˜μ–΄κ°€λ³΄κ² μŠ΅λ‹ˆλ‹€.

이전 PRκ³Ό λΉ„μŠ·ν•˜κ²Œ, 각 λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλ₯Ό 인접 리슀트둜 κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
μ•„λž˜λŠ” 예제 μž…λ ₯ 1을 인접 리슀트둜 κ΅¬ν˜„ν•œ 방식을 ν‘œν˜„ν•œ κ·Έλ¦Όμž…λ‹ˆλ‹€.

char νƒ€μž…μ€ C++ λ‚΄λΆ€μ—μ„œλŠ” μ •μˆ˜(ASCII κ°’)으둜 처리되기 λ•Œλ¬Έμ— 'A'-'A' = 0이 μ„±λ¦½ν•©λ‹ˆλ‹€.
AλŠ” ASCII κ°’ 65μž…λ‹ˆλ‹€. B = 66, C = 67, D = 68 ... 이런 μ‹μœΌλ‘œ 값을 κ°€μ§€μ£±.
κ·Έλž˜μ„œ ν˜„μž¬ λ…Έλ“œ μ•ŒνŒŒλ²³ - 'A' 둜 각 λ…Έλ“œμ˜ 인덱슀λ₯Ό μ„€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • ν˜„μž¬ λ…Έλ“œκ°€ A일 λ•Œ : 'A'-'A' = 0 μ΄λ―€λ‘œ 인덱슀 0에 μžμ‹ λ…Έλ“œλ₯Ό μ €μž₯
  • ν˜„μž¬ λ…Έλ“œκ°€ B일 λ•Œ : 'B'-'A' = 1 μ΄λ―€λ‘œ 인덱슀 1에 μžμ‹ λ…Έλ“œλ₯Ό μ €μž₯

인덱슀 섀정도 λ˜μ—ˆκ³  μΈμ ‘λ¦¬μŠ€νŠΈλ„ κ΅¬ν˜„ν–ˆλ‹€λ©΄ λ§ˆμ§€λ§‰μœΌλ‘œ 각 순회λ₯Ό κ΅¬ν˜„ν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.


μ €λŠ” 각 순회λ₯Ό DFSλ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
μ½”λ“œλ₯Ό 보면 이전 PRλ“€μ—μ„œ λ³΄μ˜€λ˜ DFSλž‘ λΉ„μŠ·ν•œ ν˜•νƒœλΌλŠ”κ²Œ 감이 μ˜€μ‹€ 것 κ°™μŠ΅λ‹ˆλ‹€.

μ½”λ“œμ˜ ν˜•μ‹μ€ κ°™κ³  좜λ ₯을 μ–΄λ””μ„œ ν•˜λƒμ— 따라 μ„Έκ°€μ§€ 순회λ₯Ό 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ©

트리 (μ „μœ„, μ€‘μœ„, ν›„μœ„)순회
λ§Œμ•½ currentκ°€ '.'이면 μ’…λ£Œ ('.'은 μžμ‹μ΄ 없을 λ•Œμ˜ μž…λ ₯μž…λ‹ˆλ©)
    
    μ™Όμͺ½ μžμ‹μœΌλ‘œ ν•΄λ‹Ή 순회 호좜
    였λ₯Έμͺ½ μžμ‹μœΌλ‘œ ν•΄λ‹Ή 순회 호좜

μž¬κ·€λ₯Ό μ‚¬μš©ν•˜μ—¬ λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜λ―€λ‘œ μ΄λŸ¬ν•œ ν˜•νƒœλ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.
μ™Όμͺ½ μžμ‹λΆ€ν„° μž¬κ·€λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 μ„Έ 순회 λͺ¨λ‘ μ™Όμͺ½ μžμ‹μ΄ 였λ₯Έμͺ½ μžμ‹λ³΄λ‹€ λ¨Όμ € 방문되기 λ•Œλ¬Έμ΄μ£±.

각 μˆœνšŒλ§ˆλ‹€ μ–΄λ””μ„œ 좜λ ₯을 ν•΄μ•Ό ν•  μ§€ μ‚΄νŽ΄λ΄…μ‹œλ‹€.

  • μ „μœ„ 순회
    (루트) β†’ (μ™Όμͺ½ μžμ‹) β†’ (였λ₯Έμͺ½ μžμ‹) μˆœμ„œλ‘œ λ°©λ¬Έν•˜λ―€λ‘œ,
    λ°©λ¬Έν•˜λŠ” μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•˜λ©΄ λ©λ‹ˆλ‹€.

    μ‹œμž‘ν•  λ•Œ A둜 μ‹œμž‘ν•œλ‹€λ©΄,

  • A(좜λ ₯) β†’ A μ™Όμͺ½μžμ‹ B(좜λ ₯) β†’ B μ™Όμͺ½μžμ‹ D(좜λ ₯) β†’ D μžμ‹μ—†κ³  B 였λ₯Έμͺ½ μžμ‹ μ—†μœΌλ‹ˆ A 였λ₯Έμͺ½ μžμ‹ C(좜λ ₯)
    β†’ C μ™Όμͺ½ μžμ‹ E(좜λ ₯) β†’ E μžμ‹ μ—†μœΌλ‹ˆ C 였λ₯Έμͺ½ μžμ‹ F(좜λ ₯) β†’ F μ™Όμͺ½ μžμ‹ μ—†μœΌλ‹ˆ F 였λ₯Έμͺ½ μžμ‹ G(좜λ ₯)
    μ΄λŸ¬ν•œ μˆœμ„œλŒ€λ‘œ 좜λ ₯되겠죠.

  • μ€‘μœ„ 순회
    (μ™Όμͺ½ μžμ‹) β†’ (루트) β†’ (였λ₯Έμͺ½ μžμ‹) μˆœμ„œλ‘œ λ°©λ¬Έν•˜λ―€λ‘œ,
    μ™Όμͺ½ μžμ‹ 방문이 λλ‚œ μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•˜λ©΄ λ©λ‹ˆλ‹€.

  • ν›„μœ„ 순회
    (μ™Όμͺ½ μžμ‹) β†’ (였λ₯Έμͺ½ μžμ‹) β†’ (루트) μˆœμ„œλ‘œ λ°©λ¬Έν•˜λ―€λ‘œ,
    μžμ‹μ΄ μ—†κ±°λ‚˜ μžμ‹ λͺ¨λ‘ 방문이 λλ‚œ μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•˜λ©΄ λ©λ‹ˆλ‹€.

좜λ ₯ μœ„μΉ˜κ°€ μ •ν•΄μ‘Œλ‹€λ©΄, mainμ—μ„œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œμΌœ 각 순회 κ²°κ³Όλ₯Ό 좜λ ₯ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μˆ˜λ„ μ½”λ“œ
μž…λ ₯ N (λ…Έλ“œμ˜ 개수)
λ…Έλ“œ 정보λ₯Ό μ €μž₯ν•  λ°°μ—΄ node[26] μ •μ˜ (각 μ•ŒνŒŒλ²³μ— λŒ€ν•΄ μ™Όμͺ½, 였λ₯Έμͺ½ μžμ‹ μ €μž₯)

반볡 N번:
    λΆ€λͺ¨ λ…Έλ“œ, μ™Όμͺ½ μžμ‹, 였λ₯Έμͺ½ μžμ‹μ„ μž…λ ₯λ°›μŒ
    node[λΆ€λͺ¨ - 'A'].first 에 μ™Όμͺ½ μžμ‹ μ €μž₯
    node[λΆ€λͺ¨ - 'A'].second 에 였λ₯Έμͺ½ μžμ‹ μ €μž₯

ν•¨μˆ˜ preorder(current):
    λ§Œμ•½ currentκ°€ '.'이면 μ’…λ£Œ (μžμ‹μ΄ μ—†μœΌλ―€λ‘œ)
    
    ν˜„μž¬ λ…Έλ“œ 좜λ ₯
    μ™Όμͺ½ μžμ‹μœΌλ‘œ preorder 호좜
    였λ₯Έμͺ½ μžμ‹μœΌλ‘œ preorder 호좜

ν•¨μˆ˜ inorder(current):
    λ§Œμ•½ currentκ°€ '.'이면 μ’…λ£Œ
    
    μ™Όμͺ½ μžμ‹μœΌλ‘œ inorder 호좜
    ν˜„μž¬ λ…Έλ“œ 좜λ ₯
    였λ₯Έμͺ½ μžμ‹μœΌλ‘œ inorder 호좜

ν•¨μˆ˜ postorder(current):
    λ§Œμ•½ currentκ°€ '.'이면 μ’…λ£Œ
    
    μ™Όμͺ½ μžμ‹μœΌλ‘œ postorder 호좜
    였λ₯Έμͺ½ μžμ‹μœΌλ‘œ postorder 호좜
    ν˜„μž¬ λ…Έλ“œ 좜λ ₯

메인 μ‹€ν–‰:
    preorder('A') 호좜
    μ€„λ°”κΏˆ
    inorder('A') 호좜
    μ€„λ°”κΏˆ
    postorder('A') 호좜

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

이진 트리 순회 μ•Œκ³ λ¦¬μ¦˜(Binary Tree Traversal Algorithm)

사이클이 μ—†λŠ” μ—°κ²° κ·Έλž˜ν”„λ₯Ό 트리라고 ν•©λ‹ˆλ‹€.
μ—¬κΈ°μ„œ 각 λ…Έλ“œκ°€ μ΅œλŒ€ 두 개의 μžμ‹ λ…Έλ“œλ₯Ό κ°€μ§€λ©΄ 이λ₯Ό 이진 트리라고 ν•©λ‹ˆλ‹€.
(두 μžμ‹ λ…Έλ“œλŠ” μ™Όμͺ½ μžμ‹ λ…Έλ“œ, 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œλΌκ³  ν•©λ‹ˆλ‹€.)

이진 νŠΈλ¦¬λŠ” 주둜 4κ°€μ§€ μˆœνšŒλ°©λ²•μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
그쀑 3κ°œλŠ” μœ„μ—μ„œ μ„€λͺ…ν–ˆλ˜ μ „μœ„, μ€‘μœ„, ν›„μœ„ 순회 이고,
λ‚˜λ¨Έμ§€ ν•˜λ‚˜κ°€ 레벨 μˆœμ„œ μˆœνšŒμž…λ‹ˆλ‹€.

κ°„λ‹¨νžˆ λ§ν•΄μ„œ λ…Έλ“œμ˜ κΉŠμ΄μ— 따라 μˆœμ„œλŒ€λ‘œ λ°©λ¬Έν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
μ–΄λ””μ„œ λΉ„μŠ·ν•œ κ±Έ λ³Έ 것 같은데....ν•˜λ‹ˆ μ—­μ‹œλ‚˜ BFS 탐색 방법을 μ‚¬μš©ν•˜λ”λΌκ΅¬μš”.
μœ„ λ¬Έμ œμ—μ„œμ˜ 예제 μž…λ ₯ 1을 레벨 μˆœμ„œ 순회둜 λ°©λ¬Έν•˜λ©΄ ABCDEFGκ°€ 좜λ ₯λ©λ‹ˆλ‹€.

νŠΈλ¦¬κ°€ 생각보닀 곡뢀할 λ‚΄μš©μ΄ λ§Žμ•„μ„œ 여기에 λ‹€ λ‹΄μ§€λŠ” λͺ»ν–ˆμŠ΅λ‹ˆλ‹€..!

μ—¬λŸ¬ 자료λ₯Ό μ°Έκ³ ν–ˆμ§€λ§Œ κ°€μž₯ 도움이 됐던 자료λ₯Ό λ‚¨κΉλ‹ˆλ‹€.
[자료ꡬ쑰] Tree - Binary Tree (이진 트리) - κ°œλ…κ³Ό κ΅¬ν˜„

@froglike6
Copy link
Collaborator

νŠΈλ¦¬λ„ 정말 μ˜€λžœλ§Œμ— λ³΄λ„€μš”. μ²˜μŒμ— 트리λ₯Ό μΈμ ‘ν–‰λ ¬λ‘œ λ°›μœΌλ €κ³  ν–ˆλ‹€κ°€, 파이썬의 λ”•μ…”λ„ˆλ¦¬κ°€ λ– μ˜¬λΌμ„œ κ·Έκ±Έ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. tree[parent] = (left, right)와 같이 μ €μž₯ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

Python

def preorder(tree, node, result):
    if node == '.':
        return
    result.append(node)
    preorder(tree, tree[node][0], result)
    preorder(tree, tree[node][1], result)

def inorder(tree, node, result):
    if node == '.':
        return
    inorder(tree, tree[node][0], result)
    result.append(node)
    inorder(tree, tree[node][1], result)

def postorder(tree, node, result):
    if node == '.':
        return
    postorder(tree, tree[node][0], result)
    postorder(tree, tree[node][1], result)
    result.append(node)

import sys
input = sys.stdin.readline

tree = {}

for _ in range(int(input())):
    parent, left, right = input().split()
    tree[parent] = (left, right)

pre_result = []
in_result = []
post_result = []

preorder(tree, 'A', pre_result)
inorder(tree, 'A', in_result)
postorder(tree, 'A', post_result)

print(''.join(pre_result))
print(''.join(in_result))
print(''.join(post_result))

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return 0 λΉ μ‘Œμ–΄μš” γ…Žγ…Ž

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ•„ λ§žλ‹€! γ…‹γ…‹γ…‹γ…‹
덕뢄에 return 0 μ•ˆμΌλŠ”λ°λ„ μ™œ λŒμ•„κ°€λŠ”μ§€μ— λŒ€ν•΄μ„œ μ°Ύμ•„λ΄€μŠ΅λ‹ˆλ‹€...γ…Ž

return 0은 ν”„λ‘œκ·Έλž¨μ΄ μ •μƒμ μœΌλ‘œ 잘 μ’…λ£Œλ˜μ—ˆμŒμ„ μš΄μ˜μ²΄μ œμ— μ•Œλ¦¬κΈ° μœ„ν•¨μΈλ°,
CλŠ” C99 μ΄ν›„λ‘œ, C++은 C++11μ΄ν›„λ‘œ λͺ…μ‹œμ μœΌλ‘œ return 0을 μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ μ•Œμ•„μ„œ mainμ—μ„œ 0을 λ°˜ν™˜ν•˜κ²Œ λ˜μ—ˆλ‹€λ„€μš”!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

λ§žμ•„μš” γ…Žγ…Ž λ°±μ€€μ—μ„œ void main이 μ•ˆ λ˜λŠ” μ΄μœ λ„ 같은 μ΄μœ μž…λ‹ˆλ‹€

Copy link
Collaborator

@hadongun hadongun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

νŠΈλ¦¬λŠ” λ“€μ–΄λ³΄κΈ°λ§Œ ν•˜κ³  처음 κ³΅λΆ€ν•΄λ΄€λ„€μš”..! μ°Έμ‘°ν•΄μ£Όμ‹  링크가 큰 도움이 λμ–΄μš”
μ²˜μŒμ— 클래슀둜 κ΅¬ν˜„ν•΄λ³΄λ € ν–ˆλŠ”λ° ν΄λž˜μŠ€μ™€ νŠΈλ¦¬κ°€ λͺ¨λ‘ 초면이라.. 2차원 λ°°μ—΄λ‘œ μ „μœ„μˆœνšŒλ§Œμ΄λΌλ„ κ΅¬ν˜„ν•΄λ΄€μŠ΅λ‹ˆλ‹€..! 생각보닀 ν₯λ―Έλ‘œμ›Œμ„œ 더 κ³΅λΆ€ν•΄λ³΄κ³ μ‹Άλ„€μš”

νŒŒμ΄λ–€

import sys

N = int(input())
tree = [[None, None] for _ in range(N)]
for i in range(N):
    a, b, c = sys.stdin.readline().split()
    tree[ord(a) - 65][0] = b
    tree[ord(a) - 65][1] = c

        
def preorder(node):
    if node == ".":
        return
    print(node, end='')
    idx = ord(node) - ord('A')
    preorder(tree[idx][0])
    preorder(tree[idx][1])

preorder('A')
    

@dohyeondol1
Copy link
Contributor Author

@hadongun
νŠΈλ¦¬λŠ” νŠΉνžˆλ‚˜ ꡬ쑰가 μ‰½κ²Œ κ·Έλ €μ Έμ„œ ν₯λ―Έλ₯Ό μ‰½κ²Œ λŠλ‚„ 수 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€!
λ‚˜μ€‘μ—” λ™μœ€λ‹˜μ˜ PRμ—μ„œ 트리λ₯Ό ν•œλ²ˆ 보고 μ‹Άλ„€μš” γ…Žγ…Ž

Copy link
Collaborator

@caucsejunseo caucsejunseo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

νŠΈλ¦¬λ„ 처음 λ³΄λŠ” μΉœκ΅¬λ„€μš” κ·Έλ¦Όκ³Ό μ²¨λΆ€νŒŒμΌμ„ μ˜¬λ €μ£Όμ…”μ„œ νŽΈν•˜κ²Œ κ³΅λΆ€ν–ˆμŠ΅λ‹ˆλ‹€!

μ•„μŠ€ν‚€μ½”λ“œμ™€ μž¬κ·€ν•¨μˆ˜ 같이 ν‰μ†Œ μ•ˆμ“°λ˜ 것듀은 λ°”λ‘œλ°”λ‘œ 생각이 μ•ˆλ‚˜λ„€μš”. ν™•μ‹€νžˆ 더 λ‹€μ–‘ν•˜κ³  λ§Žμ€ 문제 접해봐야 ν•  κ±° κ°™μŠ΅λ‹ˆλ‹€!

@dohyeondol1
Copy link
Contributor Author

νŠΈλ¦¬λ„ 처음 λ³΄λŠ” μΉœκ΅¬λ„€μš” κ·Έλ¦Όκ³Ό μ²¨λΆ€νŒŒμΌμ„ μ˜¬λ €μ£Όμ…”μ„œ νŽΈν•˜κ²Œ κ³΅λΆ€ν–ˆμŠ΅λ‹ˆλ‹€!

μ•„μŠ€ν‚€μ½”λ“œμ™€ μž¬κ·€ν•¨μˆ˜ 같이 ν‰μ†Œ μ•ˆμ“°λ˜ 것듀은 λ°”λ‘œλ°”λ‘œ 생각이 μ•ˆλ‚˜λ„€μš”. ν™•μ‹€νžˆ 더 λ‹€μ–‘ν•˜κ³  λ§Žμ€ 문제 접해봐야 ν•  κ±° κ°™μŠ΅λ‹ˆλ‹€!

μž¬κ·€ν•¨μˆ˜λŠ” μž¬λ°ŒλŠ” λ¬Έμ œλ“€μ΄ λ§ŽμœΌλ‹ˆ μ‘°κΈˆμ”© λ¨Ήμ–΄λ³΄λ©΄μ„œ μ΅μˆ™ν•΄μ§€μ…”λ„ μ’‹μŠ΅λ‹ˆλ‹€!

@dohyeondol1 dohyeondol1 merged commit 40be8f9 into main Apr 14, 2025
@dohyeondol1 dohyeondol1 deleted the 7-dohyeondol1 branch May 3, 2025 16:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants