🌈 [Section2] 4. 자료ꡬ쑰2

ν˜„μ£ΌΒ·2022λ…„ 9μ›” 25일
0

bootcamp

λͺ©λ‘ 보기
23/71

πŸ“• 였늘 배운 λ‚΄μš©!

  • 트리 (Tree)
  • 이진 탐색 트리 (Binary Search Tree)
  • κ·Έλž˜ν”„ (Graph)

✏️ 트리 (Tree)

  • ν•˜λ‚˜μ˜ λΏŒλ¦¬λ‘œλΆ€ν„° 가지가 μ‚¬λ°©μœΌλ‘œ 뻗은 ν˜•νƒœκ°€ λ‚˜λ¬΄λ₯Ό 거꾸둜 뒀집어 놓은 λ“―ν•œ ν˜•νƒœ
    (단방ν–₯ κ·Έλž˜ν”„μ˜ ν•œ ꡬ쑰) ➜ 사이클이 μ—†μŒ
    ( 루트(λ‚˜λ¬΄μ˜ 뿌리)λ₯Ό μ‹œμž‘μœΌλ‘œ μ—¬λŸ¬κ°œμ˜ 데이터λ₯Ό κ°„μ„ (edge)(λ‚˜λ¬΄μ˜ 가지듀)으둜 μ—°κ²° )

  • 계측적 자료ꡬ쑰 ➜ ν•œ 데이터가 λ°”λ‘œ μ•„λž˜μ— μžˆλŠ” ν•˜λ‚˜ μ΄μƒμ˜ 데이터에 무방ν–₯으둜 μ—°κ²°λ˜μ–΄ 있음

  • 두 개의 λ…Έλ“œκ°€ μƒν•˜ κ³„μΈ΅μœΌλ‘œ μ—°κ²°λ˜λ©΄ λΆ€λͺ¨/μžμ‹ 관계

  • λΉ„μ„ ν˜• ꡬ쑰 ➜ ν•˜λ‚˜μ˜ 데이터 μ•„λž˜μ— μ—¬λŸ¬ 개의 데이터가 쑴재

    πŸ’‘ μ„ ν˜• ꡬ쑰와 λΉ„μ„ ν˜• ꡬ쑰의 차이

βœ” 트리 κ΅¬ν˜„ λ©”μ„œλ“œ

  • addChildNode(value) - μž…λ ₯받은 valueλ₯Ό Tree에 κ³„μΈ΅μ μœΌλ‘œ μΆ”κ°€
    β €
  • removeChildNode(node) - μž…λ ₯받은 nodeλ₯Ό Treeμ—μ„œ μ‚­μ œ
    β €
  • getChildrenNode() - ν˜„μž¬ νŠΈλ¦¬μ—μ„œ μ‘΄μž¬ν•˜λŠ” children을 리턴
    β €
  • contains(value) - νŠΈλ¦¬μ— ν¬ν•¨λœ 데이터가 μžˆλŠ”μ§€λ₯Ό Boolean νƒ€μž…μœΌλ‘œ 리턴
  • 깊이, 높이, 레벨 λ“± μΈ‘μ •

    βœ” 깊이 (depth)

    • λ£¨νŠΈλ‘œλΆ€ν„° ν•˜μœ„ κ³„μΈ΅μ˜ νŠΉμ • λ…Έλ“œκΉŒμ§€μ˜ 깊이(depth)
    • 루트(λ§¨μœ„)λŠ” κΉŠμ΄κ°€ 0이고 λ°‘μœΌλ‘œ ν•œ λ ˆλ²¨μ”© λ‚΄λ €κ°ˆ 수둝 깊이 1증가

    βœ” 레벨(Level)

    • 트리 κ΅¬μ‘°μ—μ„œ 같은 깊이λ₯Ό 가지고 μžˆλŠ” λ…Έλ“œλ₯Ό 레벨(level)둜 ν‘œν˜„κ°€λŠ₯
    • 루트(λ§¨μœ„)λΆ€ν„° 레벨1, κΉŠμ΄κ°€ λ‚΄λ €κ°ˆ 수둝 레벨2,3,4 ..둜 증가

    βœ” 높이(Height)

    • 리프 λ…Έλ“œ(각 λ…Έλ“œμ˜ 맨 μ•„λž˜)λ₯Ό κΈ°μ€€μœΌλ‘œ λ£¨νŠΈκΉŒμ§€μ˜ 높이(height)λ₯Ό ν‘œν˜„ κ°€λŠ₯
    • λΆ€λͺ¨ λ…Έλ“œ 높이 = μžμ‹ λ…Έλ“œμ˜ κ°€μž₯ 높은 height κ°’ + 1
    • 리프 λ…Έλ“œμ˜ λ†’μ΄λŠ” 0이고 μœ„λ‘œ ν•œ λ ˆλ²¨μ”© 올라갈 수둝 높이 1 증가
      β €
      Ex. λŒ€ν‘œμ μœΌλ‘œ 파일(디렉토리) ꡬ쑰, μ›”λ“œμ»΅ ν† λ„ˆλ¨ΌνŠΈ λŒ€μ§„ν‘œ, 쑱보, νšŒμ‚¬μ˜ 쑰직도 λ“±
      ( ν΄λ”λŠ” ν•˜λ‚˜μ˜ 폴더(루트 폴더, /)μ—μ„œ μ‹œμž‘λ˜μ–΄, 가지λ₯Ό λ»—μ–΄λ‚˜κ°€λŠ” λͺ¨μ–‘μƒˆ )

βœ”οΈ μš©μ–΄

  • λ…Έλ“œ(Node) - 트리 ꡬ쑰λ₯Ό μ΄λ£¨λŠ” λͺ¨λ“  κ°œλ³„ 데이터
  • 루트(Root) - 트리 ꡬ쑰의 μ‹œμž‘μ μ΄ λ˜λŠ” λ…Έλ“œ (맨 μœ„ λ…Έλ“œ)
  • 리프(Leaf) - 트리 ꡬ쑰의 끝 지점, μžμ‹ λ…Έλ“œκ°€ μ—†λŠ” λ…Έλ“œ (맨 μ•„λž˜ λ…Έλ“œ)
  • λΆ€λͺ¨ λ…Έλ“œ(Parent node) - 두 λ…Έλ“œκ°€ μƒν•˜κ΄€κ³„λ‘œ μ—°κ²°λ˜μ–΄ μžˆμ„ λ•Œ, μƒλŒ€μ μœΌλ‘œ λ£¨νŠΈμ—μ„œ κ°€κΉŒμš΄ λ…Έλ“œ
    ( μƒν•˜κ΄€κ³„ 쀑 μƒμœ„ λ…Έλ“œ )
  • μžμ‹ λ…Έλ“œ(Child node) - 두 λ…Έλ“œκ°€ μƒν•˜κ΄€κ³„λ‘œ μ—°κ²°λ˜μ–΄ μžˆμ„ λ•Œ μƒλŒ€μ μœΌλ‘œ λ£¨νŠΈμ—μ„œ λ¨Ό λ…Έλ“œ
    ( μƒν•˜κ΄€κ³„ 쀑 ν•˜μœ„ λ…Έλ“œ )
  • ν˜•μ œ λ…Έλ“œ(Sibling Node) - 같은 λ ˆλ²¨μ— λ‚˜λž€νžˆ μžˆλŠ” λ…Έλ“œ
  • μ„œλΈŒ 트리(Sub tree) - rootμ—μ„œ λ»—μ–΄ λ‚˜μ˜€λŠ” 큰 트리의 내뢀에, 트리 ꡬ쑰λ₯Ό κ°–μΆ˜ μž‘μ€ 트리

✏️ 이진 트리 (Binary Tree)

  • μžμ‹ λ…Έλ“œκ°€ μ΅œλŒ€ 두 개인 λ…Έλ“œλ“€λ‘œ κ΅¬μ„±λœ 트리 ( μ™Όμͺ½ μžμ‹ λ…Έλ“œ / 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œλ‘œ ꡬ뢄 )

  • 이진 탐색 νŠΈλ¦¬μ™€ λ‹€λ₯΄κ²Œ λ…Έλ“œκ°„μ˜ λŒ€μ†Œκ΄€κ³„λŠ” μ‹ κ²½ X

  • 자료의 μ‚½μž…, μ‚­μ œ 방법에 따라 μ • 이진 트리(Full binary tree), μ™„μ „ 이진 트리(Complete binary tree), 포화 이진 트리(Perfect binary tree)둜 λ‚˜λ‰¨

βœ” μ • 이진 트리 (Full binary tree)

➜ μžμ‹ λ…Έλ“œκ°€ μ•„μ˜ˆ μ—†κ±°λ‚˜, μ΅œλŒ€ λ‘˜λΏμΈ 트리 ( μžμ‹μ„ ν•˜λ‚˜λ§Œ 가진 λ…Έλ“œκ°€ μ—†μ–΄μ•Ό 함 )

βœ” μ™„μ „ 이진 트리 (Complete binary tree)

➜ λ§ˆμ§€λ§‰ λ ˆλ²¨μ„ μ œμ™Έν•œ λͺ¨λ“  μ„œλΈŒνŠΈλ¦¬μ˜ 레벨이 κ°™κ³ , λ§ˆμ§€λ§‰ λ ˆλ²¨μ€ μ „λΆ€ μ°¨ μžˆμ§€ μ•Šμ•„λ„ λ˜μ§€λ§Œ μ™Όμͺ½λΆ€ν„° μ±„μ›Œμ Έ μžˆμ–΄μ•Ό ν•˜λŠ” 트리

βœ” 포화 이진 트리 (Perfect binary tree)

➜ λͺ¨λ“  리프 λ…Έλ“œμ˜ 레벨이 κ°™κ³ , λΉˆκ³΅κ°„ 없이 λͺ¨λ“  λ…Έλ“œκ°€ 2개의 μžμ‹μ„ κ°–κ³ μžˆλŠ” 트리 ( μ™„λ²½ν•œ ν”ΌλΌλ―Έλ“œ ν˜•νƒœ )
➜ μ • 이진 νŠΈλ¦¬μ΄λ©΄μ„œ μ™„μ „ 이진 트리인 경우

높이가 h μΌλ•Œ μ΅œλŒ€ λ…Έλ“œμ˜ μˆ˜λŠ”Β 2^(h+1) -1Β κ°œμ΄λ‹€ μ΄λ•Œ μ΄μ§„νŠΈλ¦¬μ—μ„œ μ΅œλŒ€ λ…Έλ“œμ˜ 수λ₯Ό λ§Œμ‘±ν•˜λŠ” 트리λ₯Ό 포화 μ΄μ§„νŠΈλ¦¬λΌ ν•œλ‹€Β (ex - 높이가 3인경우 μ΅œλŒ€ λ…Έλ“œ 수 : 2^6 - 1 =Β 15)

✏️ 이진 탐색 트리(Binary Search Tree)

  • 탐색을 μœ„ν•œ 이진 트리

  • λͺ¨λ“  μ™Όμͺ½ μžμ‹μ˜ 값이 λ£¨νŠΈλ‚˜ λΆ€λͺ¨λ³΄λ‹€ μž‘κ³ , λͺ¨λ“  였λ₯Έμͺ½ μžμ‹μ˜ 값이 λ£¨νŠΈλ‚˜ λΆ€λͺ¨λ³΄λ‹€ 큰 값을 가짐


✏️ κ·Έλž˜ν”„ (Graph)

  • μ—¬λŸ¬κ°œμ˜ 점듀이 μ„œλ‘œ λ³΅μž‘ν•˜κ²Œ μ—°κ²°λ˜μ–΄ μžˆλŠ” 관계λ₯Ό ν‘œν˜„ν•œ 자료ꡬ쑰 (λ³΅μž‘ν•œ λ„€νŠΈμ›Œν¬λ§)

  • 직접적인 κ΄€κ³„μ˜ 경우, 두 점 사이λ₯Ό μ΄μ–΄μ£ΌλŠ” 선이 있음

  • 간접적인 κ΄€κ³„μ˜ 경우, λͺ‡ 개의 점과 선에 걸쳐 이어짐

( νŠΈλ¦¬λ„ κ·Έλž˜ν”„μ˜ ν•œ μ’…λ₯˜ )

  • λ°°μ—΄κ³Ό λ‹€λ₯΄κ²Œ indexκ°€ 0λΆ€ν„° 쑴재

βœ” κ·Έλž˜ν”„ κ΅¬ν˜„ λ©”μ„œλ“œ

  • Arrays.deepToString() - 닀차원 λ°°μ—΄(배열이 또 λ‹€λ₯Έ 배열을 μš”μ†Œλ‘œ 가지고 μžˆλŠ” λ°°μ—΄)을 String으둜 λ³€ν™˜ ➜ 2차원 λ°°μ—΄μ˜ 값을 좜λ ₯ν•˜κΈ° μ’‹μŒ
    ( 2차원 λ°°μ—΄ = 1개의 λ°°μ—΄ μ•ˆμ— μš”μ†Œλ‘œμ„œ λ‹€λ₯Έ 배열을 가지고 μžˆλŠ” ν˜•νƒœ )
    β €
  • setGraph(size) - κ·Έλž˜ν”„μ— size만큼의 λ²„ν…μŠ€ μΆ”κ°€
    β €
  • getGraph() - 인접 ν–‰λ ¬ 정보가 λ‹΄κΈ΄ λ°°μ—΄ λ°˜ν™˜
    β €
  • addEdge(from, to) - fromVertex와 toVertex 사이 κ°„μ„  μΆ”κ°€
    β €
  • addEdge(개수) - 정점 μΆ”κ°€
    β €
  • hasEdge(from, to) - fromVertex와 toVertex μ‚¬μ΄μ˜ 간선이 μ‘΄μž¬ν•˜λŠ”μ§€ μ—¬λΆ€ Boolean으둜 λ°˜ν™˜ (있으면 true / μ—†μœΌλ©΄ false)
    β €
  • removeEdge(from, to) - fromVertex와 toVertex 사이 κ°„μ„  μ‚­μ œ

βœ” κ·Έλž˜ν”„ ν‘œν˜„ 방법

1. 인접 ν–‰λ ¬

  • μ„œλ‘œ λ‹€λ₯Έ 정점듀이 μΈμ ‘ν•œ μƒνƒœμΈμ§€λ₯Ό ν‘œμ‹œν•œ ν–‰λ ¬ ( μΈμ ‘ν•˜λ©΄ 1(true), μ•„λ‹ˆλ©΄ 0(false) )
  • 2차원 λ°°μ—΄ matrix의 ν˜•νƒœλ‘œ λ‚˜νƒ€λƒ„

    Ex.
    matrix[v][w] = 1 : 정점 vμ—μ„œ 정점 w둜 κ°€λŠ” 간선이 있음
    matrix[v][w] = 0 : 정점 vμ—μ„œ 정점 w둜 κ°€λŠ” 간선이 μ—†μŒ
    matrix.length (matrix ν–‰μ˜ 길이) = matrix[i].length (matrix iν–‰μ˜ μ—΄(μš”μ†Œλ“€)의 길이)

βœ”οΈ 인접 행렬이 μ‚¬μš©λ˜λŠ” 경우

  • 두 정점 사이에 관계가 μžˆλŠ”μ§€, μ—†λŠ”μ§€ 확인
    Ex. Aμ—μ„œ B둜 μ§„μΆœν•˜λŠ” 간선이 μžˆλŠ”μ§€ νŒŒμ•…ν•˜κΈ° μœ„ν•΄ ➜ 0 번째 μ€„μ˜ 1 번째 열에 μ–΄λ–€ 값이 μ €μž₯λ˜μ–΄μžˆλŠ”μ§€ λ°”λ‘œ 확인 κ°€λŠ₯
  • κ°€μž₯ λΉ λ₯Έ 경둜(shortest path)λ₯Ό 찾고자 ν•  λ•Œ 주둜 μ‚¬μš©
  • 무방ν–₯ κ·Έλž˜ν”„ ⬇️
  • λ°©ν–₯ κ·Έλž˜ν”„ / λΉ„κ°€μ€‘μΉ˜ κ·Έλž˜ν”„ ⬇️
  • κ°€μ€‘μΉ˜ κ·Έλž˜ν”„ ⬇️

2. 인접 리슀트

  • 각 정점이 μ–΄λ–€ 정점과 μΈμ ‘ν•˜λŠ”μ§€λ₯Ό 리슀트의 ν˜•νƒœλ‘œ ν‘œν˜„
  • 각 μ •μ λ§ˆλ‹€ ν•˜λ‚˜μ˜ 리슀트 가지고 있음 ( 이 λ¦¬μŠ€νŠΈλŠ” μžμ‹ κ³Ό μΈμ ‘ν•œ λ‹€λ₯Έ 정점을 λ‹΄κ³  있음 )

βœ”οΈ 인접 λ¦¬μŠ€νŠΈκ°€ μ‚¬μš©λ˜λŠ” 경우

  • λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 μ‚¬μš©ν•˜κ³  싢을 λ•Œ μ‚¬μš©
    ( 인접 행렬은 μ—°κ²° κ°€λŠ₯ν•œ λͺ¨λ“  경우의 수λ₯Ό μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— μƒλŒ€μ μœΌλ‘œ λ©”λͺ¨λ¦¬ 많이 차지 )
  • 무방ν–₯ κ·Έλž˜ν”„ ⬇️
    ( νŠΉμ • λ…Έλ“œμ— λŒ€ν•œ λͺ¨λ“  인접 λ…Έλ“œλ₯Ό μˆœνšŒν–ˆμ„ λ•Œ, 인접 λͺ©λ‘μ˜ λ§ˆμ§€λ§‰ λ…Έλ“œμ˜ λ‹€μŒ 포인터 ν•„λ“œμ— NULL을 μ €μž₯ )
    ➜ 인접 λͺ©λ‘μ˜ 총 길이 = κ·Έλž˜ν”„ κ°„μ„  수의 두 λ°°
    ( μ•„λž˜ κ·Έλž˜ν”„μ—μ„œ κ°„μ„ μ˜ 총 개수 = 6개, 인접 λͺ©λ‘μ˜ 길이의 ν•© = 12 )
  • λ°©ν–₯ κ·Έλž˜ν”„ / λΉ„κ°€μ€‘μΉ˜ κ·Έλž˜ν”„ ⬇️
    ➜ 인접 λͺ©λ‘μ˜ 총 길이 = κ·Έλž˜ν”„μ˜ κ°„μ„  수
    ( μ•„λž˜ κ·Έλž˜ν”„μ—μ„œ κ°„μ„ μ˜ 총 개수 = 9개, 인접 λͺ©λ‘ 길이의 ν•© = 9 )
  • κ°€μ€‘μΉ˜ κ·Έλž˜ν”„ ⬇️
    ( κ°€μž₯자리의 κ°€μ€‘μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μƒˆ ν•„λ“œλ₯Ό 각 λͺ©λ‘ λ…Έλ“œμ— μΆ”κ°€ν•΄μ•Ό 함 )

βœ”οΈ μš©μ–΄

  • 정점 (vertex) - 데이터가 μ €μž₯λ˜λŠ” κ·Έλž˜ν”„μ˜ κΈ°λ³Έ μ›μ†Œ ( λ…Έλ“œ(node) )
  • κ°„μ„  (edge) - 정점을 μ΄μ–΄μ£ΌλŠ” μ„ 
  • 인접 정점 (adjacent vertex) - ν•˜λ‚˜μ˜ μ •μ μ—μ„œ κ°„μ„ μœΌλ‘œ 직접 μ—°κ²°λ˜μ–΄ μžˆλŠ” 정점
  • κ°€μ€‘μΉ˜ κ·Έλž˜ν”„ (weighted Graph) - μ—°κ²°μ˜ 강도(좔가적인 정보)κ°€ μ–Όλ§ˆλ‚˜ λ˜λŠ”μ§€ μ ν˜€μ Έ μžˆλŠ” κ·Έλž˜ν”„
  • λΉ„κ°€μ€‘μΉ˜ κ·Έλž˜ν”„ (unweighted Graph) - μ—°κ²°μ˜ 강도가 μ ν˜€μ Έ μžˆμ§€ μ•ŠλŠ” κ·Έλž˜ν”„
  • 무방ν–₯ κ·Έλž˜ν”„ (undirected graph) - λͺ¨λ“  간선이 λ°©ν–₯이 없이 ν‘œν˜„λ˜μ–΄μžˆλŠ” κ·Έλž˜ν”„ ( 각 정점이 μ™”λ‹€κ°”λ‹€ κ°€λŠ₯ )
    Ex. 정점 v와 정점 wλ₯Ό μ—°κ²°ν•˜λŠ” 간선을 (v, w)라고 ν•˜λ©΄, (v, w)와 (w, v)λŠ” 같은 κ°„μ„ .
    정점 n개일 λ•Œ 무방ν–₯ κ·Έλž˜ν”„κ°€ κ°€μ§ˆ 수 μžˆλŠ” μ΅œλŒ€ κ°„μ„  μˆ˜λŠ” n(n-1)/2개
  • λ°©ν–₯ κ·Έλž˜ν”„ (directed graph) - λͺ¨λ“  간선이 λ°©ν–₯이 ν‘œν˜„λ˜μ–΄ μžˆλŠ” κ·Έλž˜ν”„ ( 단방ν–₯으둜만 μ§„μΆœ κ°€λŠ₯ )
    Ex. 정점 vμ—μ„œ w둜 κ°€λŠ” 간선을 (v, w)라고 ν•˜κ³ , μ΄λ•ŒλŠ” κ°„μ„  (w, v)와 닀름.
    정점 n개일 λ•Œ λ°©ν–₯ κ·Έλž˜ν”„κ°€ κ°€μ§ˆ 수 μžˆλŠ” μ΅œλŒ€ κ°„μ„  μˆ˜λŠ” n(n-1)개
  • μ§„μž…μ°¨μˆ˜ (in-degree) / μ§„μΆœμ°¨μˆ˜ (out-degree) - ν•œ 정점에 μ§„μž…(λ“€μ–΄μ˜€λŠ” κ°„μ„ )ν•˜κ³  μ§„μΆœ(λ‚˜κ°€λŠ” κ°„μ„ )ν•˜λŠ” 간선이 λͺ‡ κ°œμΈμ§€
  • 인접 (adjacency) - 두 정점 간에 간선이 직접 이어져 μžˆλ‹€λ©΄ 이 두 정점은 μΈμ ‘ν•œ 정점
  • 자기 루프 (self loop): μ •μ μ—μ„œ μ§„μΆœν•˜λŠ” 간선이 λ‹€λ₯Έ 정점을 κ±°μΉ˜μ§€ μ•Šκ³ , κ³§λ°”λ‘œ 자기 μžμ‹ μ—κ²Œ μ§„μž…ν•˜λŠ” 경우 ( 자기 루프λ₯Ό κ°€μ‘Œλ‹€ )
  • 사이클 (cycle) - ν•œ μ •μ μ—μ„œ μΆœλ°œν•˜μ—¬ λ‹€μ‹œ ν•΄λ‹Ή μ •μ μœΌλ‘œ λŒμ•„κ°ˆ 수 μžˆλŠ” 경우 (사이클이 μ‘΄μž¬ν•˜λŠ” κ·Έλž˜ν”„ 라고 함)

[μ°Έκ³ ] https://www.softwaretestinghelp.com/java-graph-tutorial/


🌈 λŠλ‚€μ 

이번 ν•™μŠ΅μ€ Coplit λ¬Έμ œλ“€μ— μ§‘μ€‘ν•˜λ‹€κ°€ μ‹œκ°„μ΄ μ—†μ–΄ 당일에 λΈ”λ‘œκ·Έλ₯Ό μž‘μ„±ν•˜μ§€ λͺ»ν–ˆλ‹€γ… 
κ·Έλž˜λ„ 주말에 λ³΅μŠ΅ν•˜λ©΄μ„œ λ‹€μ‹œ ν•œλ²ˆ κ°œλ…μ„ μ΄ν•΄ν–ˆλ‹€!
ν•˜μ§€λ§Œ Stack, Queue와 같이 막상 문제λ₯Ό λ§Œλ‚˜λ©΄ 잘 μ‘μš©ν•˜μ§€ λͺ»ν•  것 κ°™λ‹€..γ… 
미리 풀어봐야지 γ… γ… 

0개의 λŒ“κΈ€