😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[BAEKJOON python] 2667_λ‹¨μ§€λ²ˆν˜ΈλΆ™μ΄κΈ° λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/BAEKJOON

[BAEKJOON python] 2667_λ‹¨μ§€λ²ˆν˜ΈλΆ™μ΄κΈ°

μ§•μ§•μ•ŒνŒŒμΉ΄ 2022. 10. 7. 23:39
728x90
λ°˜μ‘ν˜•
μ •μ‚¬κ°ν˜• λͺ¨μ–‘μ˜ 지도가 μžˆλ‹€. 1은 집이 μžˆλŠ” 곳을, 0은 집이 μ—†λŠ” 곳을 λ‚˜νƒ€λ‚Έλ‹€.
μ² μˆ˜λŠ” 이 지도λ₯Ό 가지고 μ—°κ²°λœ μ§‘μ˜ λͺ¨μž„인 단지λ₯Ό μ •μ˜ν•˜κ³ , 단지에 번호λ₯Ό 뢙이렀 ν•œλ‹€.
μ—¬κΈ°μ„œ μ—°κ²°λ˜μ—ˆλ‹€λŠ” 것은 μ–΄λ–€ 집이 쒌우, ν˜Ήμ€ μ•„λž˜μœ„λ‘œ λ‹€λ₯Έ 집이 μžˆλŠ” 경우λ₯Ό λ§ν•œλ‹€. λŒ€κ°μ„ μƒμ— 집이 μžˆλŠ” κ²½μš°λŠ” μ—°κ²°λœ 것이 μ•„λ‹ˆλ‹€.

지도λ₯Ό μž…λ ₯ν•˜μ—¬ λ‹¨μ§€μˆ˜λ₯Ό 좜λ ₯ν•˜κ³ , 각 단지에 μ†ν•˜λŠ” μ§‘μ˜ 수λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±

첫 번째 μ€„μ—λŠ” μ§€λ„μ˜ 크기 N(μ •μ‚¬κ°ν˜•μ΄λ―€λ‘œ κ°€λ‘œμ™€ μ„Έλ‘œμ˜ ν¬κΈ°λŠ” κ°™μœΌλ©° 5≤N≤25)이 μž…λ ₯되고, κ·Έ λ‹€μŒ Nμ€„μ—λŠ” 각각 N개의 자료(0ν˜Ήμ€ 1)κ°€ μž…λ ₯
첫 번째 μ€„μ—λŠ” 총 λ‹¨μ§€μˆ˜λ₯Ό 좜λ ₯. 그리고 각 단지내 μ§‘μ˜ 수λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯

πŸ€ 1. DFS

# 1) DFS
def dfs(x, y) :
    global house_cnt

    if x < 0 or x > n-1 or y < 0 or y > n-1 :       # 지도 λ°–
        return False
    
    if graph[x][y] == False :        # 집 μ—†μŒ
        return False

    else :
        graph[x][y] = 0
        house_cnt += 1      # 집 있으면 λˆ„μ 

        for idx in range(4) :       # μž¬κ·€μ  λ°©λ¬Έ
            nx = x + dx[idx]
            ny = y + dy[idx]
            dfs(nx, ny)

        return True

n = int(input())
graph = [list(map(int, input())) for _ in range(n)]

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

house_cnt = 0
total_cnt = 0
result = []


for i in range(n) :
    for j in range(n) :
        if dfs(i, j) :      # κ²°κ³Όκ°€ True 이면!
            result.append(house_cnt)
            house_cnt = 0
            total_cnt += 1

print(total_cnt)
for i in sorted(result) :       # μ˜€λ¦„μ°¨μˆœ
    print(i)

# # input
# 7
# 0110100
# 0110101
# 1110101
# 0000111
# 0100000
# 0111110
# 0111000

# # result
# 3
# 7
# 8
# 9

πŸ€ 2. BFS

# 2) BFS
from collections import deque

n = int(input())
graph = []
result = []

for _ in range(n) :
    graph.append(list(map(int, input())))

def bfs(x, y) :
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]

    queue = deque()
    queue.append((x, y))

    graph[x][y] = 0
    count = 1

    while queue :
        x, y = queue.popleft()

        for i in range(4) :
            nx = x + dx[i]
            ny = y + dy[i]

            if nx >= 0 and nx < n and ny >= 0 and ny < n and graph[nx][ny] == 1 :
                graph[nx][ny] = 0           # μ΄ˆκΈ°ν™”
                queue.append((nx, ny))
                count += 1

    result.append(count)

for i in range(n) :
    for j in range(n) :
        if graph[i][j] == 1 :
            bfs(i, j)

print(len(result))
for i in sorted(result) :
    print(i)

# # input
# 7
# 0110100
# 0110101
# 1110101
# 0000111
# 0100000
# 0111110
# 0111000

# # result
# 3
# 7
# 8
# 9
728x90
λ°˜μ‘ν˜•
Comments