πŸ€TILπŸ€[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] Coding Test μŠ€ν„°λ””8

PYMΒ·2023λ…„ 8μ›” 24일
0

πŸ€TILπŸ€Coding Test

λͺ©λ‘ 보기
8/16
post-thumbnail

κ·Έλž˜ν”„

  • 직접적인 관계 κ°€ μžˆλŠ” 경우 두 점 사이λ₯Ό μ΄μ–΄μ£ΌλŠ” 선이 μžˆλ‹€.

  • 간접적인 관계 라면 λͺ‡ 개의 점과 선에 걸쳐 이어진닀.

  • κ·Έλž˜ν”„μ—μ„œ ν•˜λ‚˜μ˜ 점은 정점(vertex) 이라고 ν‘œν˜„ν•˜λ©°, ν•˜λ‚˜μ˜ 선은 κ°„μ„ (edge) 이라고 ν•œλ‹€.

// μ˜ˆμ‹œ μ½”λ“œ 
/*
    1 == μ„œμšΈ, 2 == λΆ€μ‚°, 3 == λŒ€μ „
    0은 μ—°κ²°λ˜μ§€ μ•Šμ€ μƒνƒœ, 1은 μ—°κ²°λœ μƒνƒœ (간선을 μ •μˆ˜λ‘œ ν‘œν˜„)
*/

[1] = [0, 1, 1]// μ„œμšΈ - λΆ€μ‚° , μ„œμšΈ - λŒ€μ „
[2] = [1, 0, 1]// λΆ€μ‚° - μ„œμšΈ , λΆ€μ‚° - λŒ€μ „
[3] = [1, 1, 0]// λŒ€μ „ - μ„œμšΈ , λŒ€μ „ - λΆ€μ‚°

πŸ’Ÿκ·Έλž˜ν”„ κ΄€λ ¨ μš©μ–΄

  • 정점 (vertex)
    λ…Έλ“œ(node)라고도 ν•˜λ©° 데이터가 μ €μž₯λ˜λŠ” κ·Έλž˜ν”„μ˜ κΈ°λ³Έ μ›μ†Œ

  • κ°„μ„  (edge)
    두 정점을 μ—°κ²°ν•˜λ©°, μ΄λ“€μ˜ 관계λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ„ .

  • 인접 정점 (adjacent vertex)
    간선에 μ˜ν•΄ 직접 μ—°κ²°λœ 정점을 의미

  • κ°€μ€‘μΉ˜ κ·Έλž˜ν”„ (weighted Graph)
    μ—°κ²°μ˜ 강도(좔가적인 정보, μ˜ˆμ‹œλ‘œ μ„œμšΈ-λΆ€μ‚°μœΌλ‘œ κ°€λŠ” 거리)λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ·Έλž˜ν”„

  • λΉ„κ°€μ€‘μΉ˜ κ·Έλž˜ν”„ (unweighted Graph)
    μ—°κ²°μ˜ 강도λ₯Ό ν‘œν˜„ν•˜μ§€ μ•ŠλŠ” κ·Έλž˜ν”„

  • 무ν–₯(무방ν–₯) κ·Έλž˜ν”„ (undirected graph)
    간선이 μ–‘λ°©ν–₯을 κ°€λ¦¬ν‚€λŠ” κ·Έλž˜ν”„.
    이 경우, ν•œ μ •μ μ—μ„œ λ‹€λ₯Έ μ •μ μœΌλ‘œ μ΄λ™ν•˜λŠ” 것과 λ°˜λŒ€λ‘œ μ΄λ™ν•˜λŠ” 것 λͺ¨λ‘ κ°€λŠ₯ν•˜λ‹€.

    • μ˜ˆμ‹œλ‘œ μ„œμšΈμ—μ„œ λΆ€μ‚°μœΌλ‘œ 갈 수 μžˆλ“―, λ°˜λŒ€λ‘œ λΆ€μ‚°μ—μ„œ μ„œμšΈλ‘œ κ°€λŠ” 것도 κ°€λŠ₯! 이게 단방ν–₯(directed) κ·Έλž˜ν”„λ‘œ κ΅¬ν˜„λœλ‹€λ©΄ μ„œμšΈμ—μ„œ 뢀산을 갈 수 μžˆμ§€λ§Œ, λΆ€μ‚°μ—μ„œ μ„œμšΈλ‘œ κ°€λŠ” 것은 λΆˆκ°€λŠ₯할것이닀. λ§Œμ•½ 두 지점이 일방톡행 λ„λ‘œλ‘œ 이어져 μžˆλ‹€λ©΄ 단방ν–₯인 κ°„μ„ μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€λŠ” 것!
  • μ§„μž…μ°¨μˆ˜ (in-degree) / μ§„μΆœμ°¨μˆ˜ (out-degree)
    ν•œ μ •μ μœΌλ‘œ λ“€μ–΄μ˜€λŠ” κ°„μ„ κ³Ό λ‚˜κ°€λŠ” κ°„μ„ μ˜ 수

  • 인접 (adjacency)
    두 정점이 직접 μ—°κ²°λ˜μ–΄ μžˆλŠ” 경우, 이듀을 μΈμ ‘ν•˜λ‹€κ³  ν‘œν˜„ν•œλ‹€

  • 자기 루프 (self loop)
    ν•œ μ •μ μ—μ„œ μ‹œμž‘ν•΄μ„œ λ°”λ‘œ κ·Έ μ •μ μœΌλ‘œ λŒμ•„μ˜€λŠ” 경둜

  • 사이클 (cycle)
    ν•œ μ •μ μ—μ„œ μ‹œμž‘ν•΄μ„œ λ‹€μ‹œ κ·Έ μ •μ μœΌλ‘œ λŒμ•„μ˜€λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•œλ‹€λ©΄, 이λ₯Ό 사이클이 μžˆλ‹€κ³  λ§ν•œλ‹€.
    λ‚΄λΉ„κ²Œμ΄μ…˜ κ·Έλž˜ν”„λŠ” μ„œμšΈ β€”> λŒ€μ „ β€”> λΆ€μ‚° β€”> μ„œμšΈλ‘œ 이동이 κ°€λŠ₯ν•˜λ―€λ‘œ, 사이클이 μ‘΄μž¬ν•˜λŠ” κ·Έλž˜ν”„λΌκ³  ν•  수 μžˆλ‹€.

🌳트리(Tree)🌳

κ·Έλž˜ν”„μ˜ μ—¬λŸ¬ ꡬ쑰 쀑 단방ν–₯ ν˜•νƒœ 쀑 ν•˜λ‚˜λ‘œ ν•˜λ‚˜μ˜ λΏŒλ¦¬μ—μ„œ λ‹€μ–‘ν•œ λ°©ν–₯으둜 가지가 λ»—μ–΄ λ‚˜κ°€λŠ” ν˜•νƒœλ₯Ό 가지고 μžˆλ‹€.

  • 마치 가계도와 μœ μ‚¬ν•œ ν˜•νƒœλ₯Ό 가지고 μžˆλŠ” 계측적 자료 κ΅¬μ‘°λ‘œμ„œ, 데이터가 λ°”λ‘œ μ•„λž˜μ— μžˆλŠ” ν•˜λ‚˜ μ΄μƒμ˜ 데이터와 무방ν–₯으둜 μ—°κ²°λœλ‹€.

  • 데이터λ₯Ό 순차적으둜 λ°°μ—΄ν•œ μ„ ν˜• ꡬ쑰와 달리, ν•˜λ‚˜μ˜ 데이터 μ•„λž˜ μ—¬λŸ¬ 데이터가 μ‘΄μž¬ν•˜λŠ” λΉ„μ„ ν˜• ꡬ쑰이닀.

  • κ³„μΈ΅μ μœΌλ‘œ ν•˜ν–₯식 ꡬ쑰둜 ν‘œν˜„μ΄ 되기 λ•Œλ¬Έμ— 사이클이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

  • 트리 κ΅¬μ‘°λŠ” β€˜λ£¨νŠΈ(Root)β€˜ λΌλŠ” ν•˜λ‚˜μ˜ 꼭짓점 λ°μ΄ν„°λ‘œ μ‹œμž‘ν•΄ μ—¬λŸ¬ 개의 데이터λ₯Ό β€˜κ°„μ„ (Edge)β€˜ 으둜 μ—°κ²°ν•œλ‹€. 각 λ°μ΄ν„°λŠ” β€˜λ…Έλ“œ(Node)’ 라고 ν•˜λ©°, 두 λ…Έλ“œκ°€ μƒν•˜ κ³„μΈ΅μœΌλ‘œ μ—°κ²°λœ λΆ€λͺ¨/μžμ‹ 관계λ₯Ό ν˜•μ„±ν•œλ‹€.

  • 참고둜, μžμ‹ λ…Έλ“œκ°€ μ—†λŠ” λ…Έλ“œλŠ” λ‚˜λ¬΄μ˜ 잎과 κ°™λ‹€ν•΄μ„œ β€˜λ¦¬ν”„ λ…Έλ“œ(Leaf Node)’이닀.

πŸ’ŸνŠΈλ¦¬μ˜ νŠΉμ§•

  • 트리 자료 κ΅¬μ‘°λŠ” 깊이, 레벨, 그리고 높이 λ₯Ό μΈ‘μ •ν•  수 μžˆλ‹€.

  • 깊이 (Depth)
    트리 κ΅¬μ‘°μ—μ„œ 깊이 λŠ” λ£¨νŠΈλΆ€ν„° νŠΉμ • λ…Έλ“œκΉŒμ§€μ˜ 거리
    μ΄λ•Œ, 루트 μžμ‹ μ˜ κΉŠμ΄λŠ” '0'이닀.

  • 레벨(Level)
    레벨 은 같은 깊이λ₯Ό 가진 λ…Έλ“œμ˜ 집합 을 의미
    κΉŠμ΄κ°€ 0인 루트 μžμ‹ μ˜ λ ˆλ²¨μ€ 1이닀.
    같은 λ ˆλ²¨μ— λ‚˜λž€νžˆ μžˆλŠ” λ…Έλ“œλ₯Ό ν˜•μ œ λ…Έλ“œ(Sibling Node)라고 ν•œλ‹€.

  • 높이(Height)
    높이 λŠ” 리프 λ…Έλ“œλ‘œλΆ€ν„° 루트 λ…Έλ“œκΉŒμ§€μ˜ 거리
    λΆ€λͺ¨ λ…Έλ“œλŠ” μžμ‹ λ…Έλ“œμ˜ κ°€μž₯ 높은 높이 값에 1을 λ”ν•œ 값을 λ†’μ΄λ‘œ 가진닀.

    • μœ„μ˜ μ˜ˆμ‹œμ—μ„œ, H, I, E, F, J의 높이와 D,G의 λ†’μ΄λŠ” 각각 0κ³Ό 1. B와 C의 λ†’μ΄λŠ” 2이닀. μ΄λ•Œ BλŠ” D의 λ†’μ΄μ—μ„œ 1을 λ”ν•œ 값을 λ†’μ΄λ‘œ 가지며, 같은 계산에 따라 루트 A의 λ†’μ΄λŠ” 3μ΄λœλ‹€.
  • μ„œλΈŒ 트리(Sub tree)
    트리 ꡬ쑰의 λ£¨νŠΈμ—μ„œ λ»—μ–΄ λ‚˜μ˜€λŠ” 큰 트리의 내뢀에, 트리 ꡬ쑰λ₯Ό κ°–μΆ˜ μž‘μ€ 트리λ₯Ό μ„œλΈŒ 트리

πŸ’ŸνŠΈλ¦¬μ˜ μž₯점

1. 효과적인 계측 ꡬ쑰 ν‘œν˜„
예λ₯Ό λ“€μ–΄, νšŒμ‚¬μ—μ„œ 쑰직도λ₯Ό μž‘μ„±ν•  λ•Œ!

2. μ •λ ¬κ³Ό 탐색에 ν™œμš© κ°€λŠ₯
이진 탐색 트리, νž™(Heap) λ“±κ³Ό 같은 λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ μ‚¬μš©λ  수 있으며, μ •λ ¬κ³Ό 탐색을 μœ„ν•œ μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜λŠ” 데에도 μ‚¬μš©λœλ‹€.

3. μ‚½μž…κ³Ό μ‚­μ œκ°€ μš©μ΄ν•¨
λ…Έλ“œμ˜ μ‚½μž…κ³Ό μ‚­μ œκ°€ 쉽닀. μ΄λŠ” μ‚½μž… 및 μ‚­μ œ μ‹œμ— ν•΄λ‹Ή λ…Έλ“œμ˜ λΆ€λͺ¨μ™€ μžμ‹ λ…Έλ“œλ§Œ μˆ˜μ •ν•˜λ©΄ 되기 λ•Œλ¬Έ!

4. ꡬ쑰 νŒŒμ•…μ˜ μš©μ΄ν•¨
μ‹œκ°ν™”κ°€ μ‰¬μš°λ―€λ‘œ, 트리λ₯Ό μ‹œκ°μ μœΌλ‘œ ν‘œν˜„ν•˜μ—¬ μ΄ν•΄ν•˜κΈ° 쉽닀.

5. λ‹€μ–‘ν•œ 뢄야에 ν™œμš© κ°€λŠ₯
λ‹€μ–‘ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ˜ κΈ°μ΄ˆκ°€ λ˜κΈ°λ•Œλ¬Έμ— λ°μ΄ν„°λ² μ΄μŠ€, μ•Œκ³ λ¦¬μ¦˜ λ“± λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ ν™œμš©λœλ‹€.

πŸ’ŸνŠΈλ¦¬μ™€ κ·Έλž˜ν”„μ˜ 차이

이진 탐색 트리(Binary Search Tree)

이진 νƒμƒ‰μ˜ 속성이 이진 νŠΈλ¦¬μ— 적용된 νŠΉλ³„ν•œ ν˜•νƒœμ˜ 이진 트리

πŸ’Ÿμ΄μ§„ νƒμƒ‰μ΄λž€?

μ •λ ¬λœ 데이터 μ€‘μ—μ„œ νŠΉμ •ν•œ 값을 μ°ΎκΈ° μœ„ν•œ 탐색 μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜

μ’€ 더 μžμ„Ένžˆ μ„€λͺ…ν•˜λ©΄,
μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λœ 데이터λ₯Ό
같은 크기의 두 λΆ€λΆ„μœΌλ‘œ λ‚˜λˆˆ ν›„,
두 λΆ€λΆ„ 쀑 탐색이 ν•„μš”ν•œ λΆ€λΆ„μ—μ„œλ§Œ νƒμƒ‰ν•˜λ„λ‘ 탐색 λ²”μœ„λ₯Ό μ œν•œν•˜μ—¬ μ›ν•˜λŠ” 값을 μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

πŸ’Ÿμ΄μ§„ 탐색 방법

  1. 전체 λ°μ΄ν„°μ—μ„œ 쀑간값을 μ°Ύμ•„ λ‚΄κ°€ 찾고자 ν•˜λŠ” 값이 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.

  2. 쀑간값이 λ‚΄κ°€ 찾고자 ν•˜λŠ” 값이 아닐 경우, μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λœ λ°μ΄ν„°μ—μ„œ 쀑간값보닀 큰 값인지 μž‘μ€ 값인지 νŒλ‹¨ (Up? Down?)

  3. 찾고자 ν•˜λŠ” 값이 쀑간값보닀 μž‘μ€ 값일 경우, λ°μ΄ν„°μ˜ 맨 μ•žλΆ€ν„° 쀑간값 μ „κΉŒμ§€μ˜ λ²”μœ„λ₯Ό 탐색 λ²”μœ„λ‘œ μ„€μ •ν•˜κ³  탐색을 반볡 μˆ˜ν–‰
    찾고자 ν•˜λŠ” 값이 쀑간값보닀 큰 값일 경우, λ°μ΄ν„°μ˜ μ€‘κ°„κ°’μ˜ λ‹€μŒ κ°’λΆ€ν„° 맨 λ§ˆμ§€λ§‰κΉŒμ§€λ₯Ό 탐색 λ²”μœ„λ‘œ 작고 탐색을 반볡 μˆ˜ν–‰

이진 탐색 νŠΈλ¦¬λŠ” μ΄λŸ¬ν•œ 이진 νƒμƒ‰μ˜ 원리λ₯Ό 이진 νŠΈλ¦¬μ— μ μš©ν•œ 것.

πŸ’Ÿμ΄μ§„ 탐색 트리의 νŠΉμ§•

트리의 루트 λ…Έλ“œλŠ” 전체 λ°μ΄ν„°μ˜ 쀑간값에 ν•΄λ‹Ήν•˜λ©°, 루트 λ…Έλ“œμ˜ μ™Όμͺ½ μ„œλΈŒ νŠΈλ¦¬λŠ” λͺ¨λ‘ 루트 λ…Έλ“œ 값보닀 μž‘μ€ κ°’λ“€λ‘œ, 였λ₯Έμͺ½ μ„œλΈŒ νŠΈλ¦¬λŠ” 루트 λ…Έλ“œ 값보닀 큰 κ°’λ“€λ‘œ 이루어져 μžˆλ‹€.

  • 각 λ…Έλ“œλŠ” μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” ν‚€(Key)λ₯Ό 가진닀. 이 ν‚€(Key)λŠ” 각 λ…Έλ“œμ— μ €μž₯된 값이닀.

  • 루트 λ…Έλ“œμ˜ μ™Όμͺ½ μ„œλΈŒ νŠΈλ¦¬λŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ 킀보닀 μž‘μ€ ν‚€λ₯Ό 가진 λ…Έλ“œλ“€λ‘œ 이루어져 있으며, 였λ₯Έμͺ½ μ„œλΈŒ νŠΈλ¦¬λŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ 킀보닀 큰 ν‚€λ₯Ό 가진 λ…Έλ“œλ“€λ‘œ 이루어져 μžˆλ‹€.

  • 각각의 μ„œλΈŒ νŠΈλ¦¬λ„ λͺ¨λ‘ 이진 탐색 트리의 속성을 가진닀.

인접행렬

인접 행렬은 μ„œλ‘œ λ‹€λ₯Έ λ…Έλ“œλ“€μ΄ μ–΄λ–»κ²Œ 인접해 μžˆλŠ”μ§€λ₯Ό λ³΄μ—¬μ£ΌλŠ” 2차원 λ°°μ—΄

즉, A λ…Έλ“œμ™€ B λ…Έλ“œκ°€ μ—°κ²°λ˜μ–΄ μžˆλ‹€λ©΄ 1(true)둜 ν‘œμ‹œν•˜κ³ , μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄ 0(false)둜 ν‘œμ‹œν•˜λŠ” ν‘œ!
(κ°€μ€‘μΉ˜κ°€ μ‘΄μž¬ν•˜λŠ” κ·Έλž˜ν”„λΌλ©΄ 1 λŒ€μ‹  κ΄€κ³„μ˜ 의미λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 값이 μ €μž₯λœλ‹€)

  • 인접 행렬은 본질적으둜 큰 ν‘œμ™€ 같은 ν˜•νƒœλ‘œ, μ΄λŠ” 두 개의 정점 κ°„μ˜ μ—°κ²° μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ”λ° 맀우 μœ μš©ν•˜κ²Œ μ‚¬μš©λœλ‹€.

    • ex. Aμ—μ„œ B둜 μ΄λ™ν•˜λŠ” κ²½λ‘œκ°€ μžˆλŠ”μ§€λ₯Ό μ•Œκ³ μž ν•œλ‹€λ©΄, λ‹¨μˆœνžˆ 0번째 ν–‰μ˜ 1번째 열에 μ €μž₯된 값을 μ°Έμ‘°ν•˜λ©΄ λœλ‹€.
  • λ˜ν•œ, 인접 행렬은 μ΅œλ‹¨ 경둜 문제λ₯Ό ν•΄κ²°ν•˜κ³ μž ν•  λ•Œ 주둜 μ‚¬μš©λœλ‹€.

    • κ·Έλž˜ν”„μ˜ λ³΅μž‘ν•œ ꡬ쑰λ₯Ό μ‰½κ²Œ νŒŒμ•…ν•˜κ³ , 졜적의 경둜λ₯Ό μ°Ύμ•„λ‚΄λŠ” 데 μœ λ¦¬ν•˜κΈ° λ•Œλ¬Έ!

μœ„μ™€ 같은 κ·Έλž˜ν”„λ₯Ό 인접 ν–‰λ ¬λ‘œ ν‘œν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

  • A의 μ§„μΆœμ°¨μˆ˜λŠ” 1개: A β€”> C
    • [0][2] == 1
  • B의 μ§„μΆœμ°¨μˆ˜λŠ” 2개: B β€”> A, B β€”> C
    • [1][0] == 1
    • [1][2] == 1
  • C의 μ§„μΆœμ°¨μˆ˜λŠ” 1개: C β€”> A
    • [2][0] == 1

μΈμ ‘λ¦¬μŠ€νŠΈ

κ·Έλž˜ν”„μ˜ 정점 κ°„ 연결을 리슀트 ν˜•μ‹μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 방식

  • 각 정점이 μ–΄λ–€ λ‹€λ₯Έ 정점듀과 μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό μ•ŒκΈ° μ‰½κ²Œ ν•΄μ€€λ‹€.

  • 각 μ •μ λ§ˆλ‹€ ν•˜λ‚˜μ˜ 리슀트λ₯Ό 가지고 있으며, 이 λ¦¬μŠ€νŠΈλŠ” μžμ‹ κ³Ό μΈμ ‘ν•œ λ‹€λ₯Έ 정점을 λ‹΄κ³  μžˆλ‹€.

  • 인접 행렬은 λͺ¨λ“  κ°€λŠ₯ν•œ 연결을 μ €μž₯ν•˜λ―€λ‘œ, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ λ†’κ²Œ λ‚˜νƒ€λ‚  수 μžˆλŠ” 반면, 인접 λ¦¬μŠ€νŠΈλŠ” μ‹€μ œ μ—°κ²°λ§Œμ„ μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ 더 효율적 이닀.

μœ„μ—μ„œ λ³Έ κ·Έλž˜ν”„λ₯Ό 인접 리슀트둜 ν‘œν˜„ν•˜λ©΄ μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™λ‹€.

graph = [
    [2, None],
    [0, 2, None],
    [0, None]
]
profile
λͺ©ν‘œλŠ” "ν•¨κ»˜ μΌν•˜κ³  싢은, ν•¨κ»˜ μΌν•΄μ„œ 쒋은" Front-end 개발자

0개의 λŒ“κΈ€