
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μ£ΌλΌλ 짧μ κΈ°κ°μλ μμΌ λ§μ κ²μ λ°°μ λ€λ κ²μ λλΌκ² ν μ£Όμμ΅λλ€.
'λμ μ΄μΌκΈ° > ν¬λνν€ μ κΈ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
ν¬λνν€ μ κΈ 2μ£Όμ°¨ WIL (0) | 2025.03.27 |
---|---|
ν¬λνν€ μ κΈ 1μ£Όμ°¨ WIL (2) | 2025.03.20 |
ν¬λνν€ μ κΈ μ μ νκΈ° & 3λ°4μΌ λ―Έλνλ‘μ νΈ & WIL & μΊ νΌμ€ μ κ²½ (2) | 2025.03.13 |
μλ νμΈμ.
ν¬μ€ν μ΄ μ’μλ€λ©΄ "μ’μμβ€οΈ" λλ "ꡬλ ππ»" ν΄μ£ΌμΈμ!