λ‚˜μ˜ 이야기/ν¬λž˜ν”„ν†€ μ •κΈ€

ν¬λž˜ν”„ν†€ μ •κΈ€ 3μ£Όμ°¨ WIL

Unused 2025. 4. 3. 16:53
WIL: Weekly I Learned; λ˜λŠ” What I Learned This Week

4월은 μ •κΈ€μ˜ 거짓말

μ§€λ‚œ 2μ£Όμ°¨ WIL을 μ™„μ„±ν•˜κΈ°κ°€ λ¬΄μ„­κ²Œ 정글이 또 λ‹€μ‹œ 눈밭이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ €λŠ” λˆˆμ„ μ°Έ μ’‹μ•„ν•˜μ§€λ§Œ, κ·ΈλŸΌμ—λ„ 저희 반 μΉœκ΅¬κ°€ μ΄μ•ΌκΈ°ν•œ 것과 같이 μ§€κΈˆ 코딩을 ν•  λ•Œκ°€ λ§žμ„κΉŒ?λΌλŠ” 생각이 듀기도 ν•˜λŠ” μ£Όμ˜€μŠ΅λ‹ˆλ‹€. κΈ°ν›„ λ³€ν™”λž€ μ°Έ λ¬΄μ„œμš΄ κ²ƒμž…λ‹ˆλ‹€.

λ°₯만 잘 먹더라

ν¬λž˜ν”„ν†€μ€ ꡬ내식당이 μ•„μ£Ό 잘 λ‚˜μ˜€λŠ” κ²ƒμœΌλ‘œ 정평이 λ‚˜ μžˆμŠ΅λ‹ˆλ‹€. μž…μ†Œ λ‹Ήμ‹œ κ·Έκ±Έ λͺ¨λ₯΄λŠ” 것은 μ•„λ‹ˆμ—ˆμ§€λ§Œ, μ œκ°€ κ°€λŠ” 곳은 ν¬λž˜ν”„ν†€ 본사가 μ•„λ‹Œ μ •κΈ€ μΊ νΌμŠ€μ΄λ‹ˆ, 사싀 큰 κΈ°λŒ€λŠ” ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μž…μ†Œ 3μ£Όμ°¨λ₯Ό λ„˜κΈ°λŠ” 이 μ‹œμ μ—μ„œ μ œκ°€ 남길 수 μžˆλŠ” 말은, μ—¬κΈ° λ°₯도 μƒλ‹Ήνžˆ λ§›μžˆλ‹€μž…λ‹ˆλ‹€. μž…μ†Œ 첫 며칠간은 일뢀 메뉴가 (제 μž…λ§›μ—λŠ”) λ‹€μ†Œκ°„ λ§€μ›Œ 걱정이 살짝 듀기도 ν–ˆμŠ΅λ‹ˆλ‹€λ§Œ μ–΄λŠ μˆœκ°„λΆ€ν„° 맀운 맛이 점점 납득 κ°€λŠ₯ν•œ μˆ˜μ€€μœΌλ‘œ λ‚΄λ €μ˜€λ”κ΅°μš”. μƒλ‹Ήνžˆ λ§Œμ‘±μŠ€λŸ½μŠ΅λ‹ˆλ‹€.

 

3주차에 저희가 νƒν—˜ν•œ λ‚΄μš©μ€ 크게 μ„Έ κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€.

자료ꡬ쑰:

  • κ·Έλž˜ν”„ (λ…Έλ“œ, 에지, κ°€μ€‘μΉ˜, λ°©ν–₯μ„± λ“±)
  • 트리
  • Trie
  • B-트리 (B-Tree)

μ•Œκ³ λ¦¬μ¦˜:

  • DFS
  • BFS
  • Disjoint Set (μœ λ‹ˆμ˜¨-νŒŒμΈλ“œ 기법)
  • 이뢄 κ·Έλž˜ν”„
  • μ΅œμ†Œ μ‹ μž₯ 트리 (ν”„λ¦Ό, 크루슀칼 μ•Œκ³ λ¦¬μ¦˜)
  • μœ„μƒ μ •λ ¬
  • μ΅œμ†Œ λΉ„μš© 계산 (λ‹€μ΅μŠ€νŠΈλΌ, ν”Œλ£¨μ΄λ“œ-와샬 μ•Œκ³ λ¦¬μ¦˜)

λ§ˆμ§€λ§‰μœΌλ‘œ CS:APP μ±…μ—μ„œλŠ” 챕터 1 (κ°œμš”)의 λ„€νŠΈμ›Œν¬, μ•”λ‹¬μ˜ 법칙, λ™μ‹œμ„±, 병렬성, 좔상화 κ°œλ…μ— λŒ€ν•΄ ν•™μŠ΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

이번 μ‹œν—˜μ€ λ°±μ€€ "λ°”λ‹₯ μž₯식", "λ‹¨μžλ²ˆν˜ΈλΆ™μ΄κΈ°", "경쟁적 μ „μ—Ό"으둜, 1λ²ˆμ„ BFS둜 ν’€λ €λ‹€κ°€ 30뢄을 λ‚ λ €λ¨Ήκ³  μ•„λž˜μ™€ 같은 ν„°λ¬΄λ‹ˆμ—†μ΄ κ°„λ‹¨ν•œ 이쀑 for문을 톡해 μ™„μ„±ν•˜μ—¬ μ œμΆœν•˜μ˜€μŠ΅λ‹ˆλ‹€. (λ†€λžκ²Œλ„ 톡과가 λ©λ‹ˆλ‹€!)

import sys
input=sys.stdin.readline

def is_within_bounds(row, col):
    global rows_n, cols_n
    
    return (0<=row<rows_n) and (0<=col<cols_n)

def kazari():
    global rows_n,cols_n,visited,yuka,count
    
    for i in range(rows_n):
        for j in range(cols_n):
            if yuka[i][j] == '-':
                if j == 0 or yuka[i][j-1] != '-':
                    count += 1                    
            elif yuka[i][j] == '|':
                if i == 0 or yuka[i-1][j] != '|':
                    count += 1

# μž…λ ₯ & μ„ΈνŒ…
rows_n, cols_n = map(int,input().split()) # N, M
yuka = [input().strip() for _ in range(rows_n)]
count = 0

# 계산 & 좜λ ₯
kazari()
print(count)

이번 주차에 λ°°μ› λ˜ 게 DFS, BFS 같은 것듀이라 μ‹œν—˜μ—λ„ λ‹Ήμ—°νžˆ 이λ₯Ό μ μš©ν•΄λ³΄λ € ν•˜μ˜€λŠ”λ°, κ²°κ΅­ μ œλŒ€λ‘œ 된 κ²°κ³Όκ°€ λ‚˜μ˜€μ§€ μ•Šμ•„ μœ„μ™€ 같이 ν’€κ³  λ§μ•˜λ˜ κ²ƒμž…λ‹ˆλ‹€. 사싀 μ΄κ²ƒλ§Œ 해도 μž₯쑱의 λ°œμ „μž„μ€ λΆ„λͺ…ν•©λ‹ˆλ‹€. λ§Œμ•½ μž…μ†Œν•˜κΈ° μ „μ˜ μ €μ—κ²Œ 이 문제λ₯Ό 풀라고 μ‹œμΌ°λ‹€λ©΄ μ•„λ§ˆ λͺ» ν’€κ±°λ‚˜, 적어도 이런 κΉ”λ”ν•œ λ‹΅μ•ˆμ€ λ‚΄μ§€ λͺ»ν–ˆμ„ 것이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

참고둜 μœ„ λ¬Έμ œλŠ” 뢄리 μ§‘ν•© (disjoint sets)의 μœ λ‹ˆμ–Έ-νŒŒμΈλ“œ λ°©μ‹μœΌλ‘œλ„ ν’€ 수 μžˆμŠ΅λ‹ˆλ‹€.

import sys
input = sys.stdin.readline

def find(parent, x):
    if parent[x] != x:
        parent[x] = find(parent, parent[x])
    return parent[x]

def union(parent, a, b):
    root_a = find(parent, a)
    root_b = find(parent, b)
    if root_a != root_b:
        parent[root_b] = root_a

# μž…λ ₯ & μ„ΈνŒ…
n, m = map(int, input().split())
yuka = [list(input().strip()) for _ in range(n)]

# 각 셀을 ν•˜λ‚˜μ˜ λ…Έλ“œλ‘œ ν‘œν˜„ (0λ²ˆλΆ€ν„° n*m-1λ²ˆκΉŒμ§€)
parent = [i for i in range(n * m)]

for i in range(n):
    for j in range(m):
        index = i * m + j
        if yuka[i][j] == '-':
            if j + 1 < m and yuka[i][j + 1] == '-':
                union(parent, index, i * m + (j + 1))
        elif yuka[i][j] == '|':
            if i + 1 < n and yuka[i + 1][j] == '|':
                union(parent, index, (i + 1) * m + j) # 같은 λ°©ν–₯의 이웃과 union 처리


unique_roots = set() # λͺ¨λ“  타일에 λŒ€ν•΄ 루트 μ°ΎκΈ°
for i in range(n * m):
    unique_roots.add(find(parent, i))

print(len(unique_roots))

μ–΄μ¨Œλ“  이 λ¬Έμ œμ™€ λ‹¨μžλ²ˆν˜ΈλΆ™μ΄κΈ°, 총 2개의 문제λ₯Ό ν’€μ–΄λƒˆλ‹€λŠ” 점은 μ’‹μ§€λ§Œμ„œλ„, λ§ˆμ§€λ§‰ 문제의 λ‹΅μ•ˆμ„ 미처 μ™„μ„±ν•˜μ§€ λͺ»ν•œ 것은 아쉽기도 ν•˜κ³ , κ·ΈλŸΌμ—λ„ 뢈과 3μ£ΌλΌλŠ” 짧은 기간에도 μƒˆμ‚Ό λ§Žμ€ 것을 λ°°μ› λ‹€λŠ” 것을 느끼게 ν•œ μ£Όμ˜€μŠ΅λ‹ˆλ‹€.