๐Ÿ”‘ CS/์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[๋ฐฑ์ค€ 1012๋ฒˆ] ์œ ๊ธฐ๋† ๋ฐฐ์ถ” (python/ํŒŒ์ด์ฌ)

๋ณต๋งŒ 2022. 6. 29. 22:21

Connected component์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ ํ†ต๊ณผํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋Œ€๋กœ ํ’€์—ˆ๋Š”๋ฐ ๊ณ„์† ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋–ด๋‹ค. ์—ด์‹ฌํžˆ ์ฐพ์•„๋ณด๋‹ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‹ค์ˆ˜๊ฐ€ ์žˆ์—ˆ๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์ ์–ด์„œ ํ†ต๊ณผํ•œ ๊ฒƒ ๋ฟ์ด์—ˆ๋‹ค.

 

๐ŸŒผ ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/1012

 

1012๋ฒˆ: ์œ ๊ธฐ๋† ๋ฐฐ์ถ”

์ฐจ์„ธ๋Œ€ ์˜๋†์ธ ํ•œ๋‚˜๋Š” ๊ฐ•์›๋„ ๊ณ ๋žญ์ง€์—์„œ ์œ ๊ธฐ๋† ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋†์•ฝ์„ ์“ฐ์ง€ ์•Š๊ณ  ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋ ค๋ฉด ๋ฐฐ์ถ”๋ฅผ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋‚˜๋Š” ํ•ด์ถฉ ๋ฐฉ์ง€์— 

www.acmicpc.net

  • ํ‹ฐ์–ด: ์‹ค๋ฒ„ II
  • ๋ถ„๋ฅ˜: ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰

 

 

โ— TRIAL 1.

๋”๋ณด๊ธฐ
์ฝ”๋“œ
from collections import deque

def check_adj(farm, v, M, N):
    if v[0]<M and v[1]<N:
        if farm[v[0]][v[1]]:
            return True

def bfs(farm, start, M, N):
    queue = deque([start])
    while queue:
        v = queue.popleft()
        farm[v[0]][v[1]] = 0
        adj_right = (v[0], v[1]+1)
        if check_adj(farm, adj_right, M, N):
            queue.append(adj_right)
        adj_bottom = (v[0]+1, v[1])
        if check_adj(farm, adj_bottom, M, N):
            queue.append(adj_bottom)
    return farm

def solution(farm):
    ans = 0
    for m in range(M):
        for n in range(N):
            if farm[m][n]:
                ans += 1
                farm = bfs(farm, (m, n), M, N)

    return ans

T = int(input())

for _ in range(T): #for each test case
    M, N, K = map(int, input().split( ))

    #prepare farm
    farm = [[0 for _ in range(N)] for _ in range(M)]
    for _ in range(K):
        x, y = map(int, input().split( ))
        farm[x][y] = 1

    print(solution(farm))

 

ํ‹€๋ฆฐ ์›์ธ

 

์‹œ๊ฐ„์ดˆ๊ณผ. ๊ฐ node์— ๋Œ€ํ•ด์„œ ์ƒํ•˜์ขŒ์šฐ ๋ชจ๋“  ์ธ์ ‘ํ•œ node๋ฅผ ๊ฒ€์‚ฌํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ์˜ค๋ฅธ์ชฝ๊ณผ ์•„๋ž˜๋งŒ ๊ฒ€์‚ฌํ–ˆ๋‹ค.

์˜ˆ์™ธ ์ผ€์ด์Šค: https://www.acmicpc.net/board/view/93090

 

 

โ— TRIAL 2.

๋”๋ณด๊ธฐ
์ฝ”๋“œ
from collections import deque

def check_adj(farm, v, M, N):
    if v[0]<M and v[1]<N:
        if farm[v[0]][v[1]]:
            return True

def bfs(farm, start, M, N):
    queue = deque([start])
    farm[start[0]][start[1]] = 0
    while queue:
        v = queue.popleft()
        farm[v[0]][v[1]] = 0
        adjs = [(v[0], v[1]+1), (v[0], v[1]-1), (v[0]+1, v[1]), (v[0]-1, v[1])]
        for adj in adjs:
            if check_adj(farm, adj, M, N):
                queue.append(adj)
    return farm

def solution(farm):
    ans = 0
    for m in range(M):
        for n in range(N):
            if farm[m][n]:
                ans += 1
                farm = bfs(farm, (m, n), M, N)

    return ans

T = int(input())

answers = []
for _ in range(T): #for each test case
    M, N, K = map(int, input().split( ))

    #prepare farm
    farm = [[0 for _ in range(N)] for _ in range(M)]
    for _ in range(K):
        x, y = map(int, input().split( ))
        farm[x][y] = 1

    print(solution(farm))

 

์ˆ˜์ •ํ•œ ๋ถ€๋ถ„

 

- ๊ฐ node์— ๋Œ€ํ•ด ์ƒํ•˜์ขŒ์šฐ ๊ฒ€์‚ฌํ•˜๋„๋ก ์ถ”๊ฐ€

 

ํ‹€๋ฆฐ ์›์ธ

 

์‹œ๊ฐ„์ดˆ๊ณผ. ์ƒํ•˜์ขŒ์šฐ node๊ฐ€ ์œ ํšจํ•œ ๊ฐ’์ธ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” check_adj ํ•จ์ˆ˜์—์„œ ์ขŒํ‘œ๊ฐ’์ด 0๋ณด๋‹ค ํฐ์ง€ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์•„์„œ ์Œ์ˆ˜ ๋ฒ”์œ„์˜ ์ขŒํ‘œ๊ฐ’์„ ํ†ต๊ณผ์‹œํ‚ด.

์˜ˆ์™ธ ์ผ€์ด์Šค: https://www.acmicpc.net/board/view/93090

 

 

โ— TRIAL 3.

๋”๋ณด๊ธฐ
์ฝ”๋“œ
from collections import deque

def check_adj(farm, v, M, N):
    if 0<=v[0]<M and 0<=v[1]<N:
        if farm[v[0]][v[1]]:
            return True

def bfs(farm, start, M, N):
    queue = deque([start])
    farm[start[0]][start[1]] = 0
    while queue:
        v = queue.popleft()
        farm[v[0]][v[1]] = 0
        adjs = [(v[0], v[1]+1), (v[0], v[1]-1), (v[0]+1, v[1]), (v[0]-1, v[1])]
        for adj in adjs:
            if check_adj(farm, adj, M, N):
                queue.append(adj)
    return farm

def solution(farm):
    ans = 0
    for m in range(M):
        for n in range(N):
            if farm[m][n]:
                ans += 1
                farm = bfs(farm, (m, n), M, N)

    return ans

T = int(input())

answers = []
for _ in range(T): #for each test case
    M, N, K = map(int, input().split( ))

    #prepare farm
    farm = [[0 for _ in range(N)] for _ in range(M)]
    for _ in range(K):
        x, y = map(int, input().split( ))
        farm[x][y] = 1

    print(solution(farm))

 

์ˆ˜์ •ํ•œ ๋ถ€๋ถ„

 

- ์ƒํ•˜์ขŒ์šฐ node์˜ ๋ฒ”์œ„๊ฐ€ 0๋ถ€ํ„ฐ M, 0๋ถ€ํ„ฐ N ์‚ฌ์ด์˜ ๊ฐ’์ธ์ง€ ๊ฒ€์‚ฌํ•จ.

 

ํ‹€๋ฆฐ ์›์ธ

 

์‹œ๊ฐ„์ดˆ๊ณผ. ์ธ์ ‘ node๋ฅผ queue์— ๋„ฃ๊ณ , ์ดํ›„์— queue์—์„œ ๊ฐ node๋ฅผ popํ•  ๋•Œ ๊ทธ ๊ฐ’์„ 0์œผ๋กœ ๋ฐ”๊ฟ”์คฌ๋Š”๋ฐ, BFS๋Š” ๊ฐ™์€ depth์˜ node๋ฅผ ๋ชจ๋‘ ๊ฒ€์‚ฌํ•œ ํ›„ ๊ทธ ๋‹ค์Œ depth๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ค‘๋ณต์œผ๋กœ queue์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊น€. 

์˜ˆ์™ธ ์ผ€์ด์Šค: https://www.acmicpc.net/board/view/84210

 

 

๐Ÿ’ก Solution

์ฝ”๋“œ
from collections import deque

def check_adj(farm, v, M, N):
    if 0<=v[0]<M and 0<=v[1]<N:
        if farm[v[0]][v[1]]:
            return True

def bfs(farm, start, M, N):
    queue = deque([start])
    farm[start[0]][start[1]] = 0
    while queue:
        v = queue.popleft()
        adjs = [(v[0], v[1]+1), (v[0], v[1]-1), (v[0]+1, v[1]), (v[0]-1, v[1])]
        for adj in adjs:
            if check_adj(farm, adj, M, N):
                queue.append(adj)
                farm[adj[0]][adj[1]] = 0
    return farm

def solution(farm):
    ans = 0
    for m in range(M):
        for n in range(N):
            if farm[m][n]:
                ans += 1
                farm = bfs(farm, (m, n), M, N)

    return ans

T = int(input())

answers = []
for _ in range(T): #for each test case
    M, N, K = map(int, input().split( ))

    #prepare farm
    farm = [[0 for _ in range(N)] for _ in range(M)]
    for _ in range(K):
        x, y = map(int, input().split( ))
        farm[x][y] = 1

    print(solution(farm))

 

์ฝ”๋“œ ์„ค๋ช…
  • ๋ชจ๋“  node์— ๋Œ€ํ•ด ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ๊ฐ’์ด 1์ธ ๊ฒฝ์šฐ BFS๋ฅผ ์ด์šฉํ•˜์—ฌ connected component๋“ค์„ ๋ชจ๋‘ 0์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

 

์ฃผ์˜ํ•  ์ 
  • BFS๋กœ connected component๋ฅผ ์ฐพ์„ ๋•Œ, ์ƒํ•˜์ขŒ์šฐ ๋ชจ๋‘๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค.
  • queue์— node๋ฅผ ๋„ฃ์„ ๋•Œ ํ•ด๋‹น node์˜ ๊ฐ’์„ ๋™์‹œ์— 0์œผ๋กœ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. pop ํ•œ ๋‹ค์Œ 0์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๊ทธ ์‚ฌ์ด์— ์ค‘๋ณต์œผ๋กœ queue์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์ด ์ƒ๊ธด๋‹ค. ์ฆ‰ queue์— ๋„ฃ์Œ๊ณผ ๋™์‹œ์— ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ฃผ์–ด์•ผ ํ•จ.
๋ฐ˜์‘ํ˜•