Algorithm/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2638 ์น˜์ฆˆ(ํŒŒ์ด์ฌ/python)

chjcoder 2023. 8. 18. 14:08

๐ŸŽˆ๋ฌธ์ œ

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

 

๐ŸŽ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ ์ ‘๊ทผ

bfs

1. ์™ธ๋ถ€๊ณต๊ธฐ์™€ ๋‚ด๋ถ€๊ณต๊ธฐ๋ฅผ ํŒ๋‹จ์„ ๋จผ์ € ํ•ด์•ผ ๋…น์„ ์น˜์ฆˆ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ๋กœ ํ–ˆ๋‹ค.

 1) ์™ธ๋ถ€๊ณต๊ธฐ / ๋‚ด๋ถ€๊ณต๊ธฐ ํŒ๋‹จ

 2) ๋…น์„ ์น˜์ฆˆ ํŒ๋‹จ

 3) ํ•˜๋‚˜๋ผ๋„ ๋…น์œผ๋ฉด ์‹œ๊ฐ„ +1

2. ์™ธ๋ถ€๊ณต๊ธฐ / ๋‚ด๋ถ€๊ณต๊ธฐ ํŒ๋‹จ

 (0,0)์€ ๊ฐ€์žฅ์ž๋ฆฌ์ด๋ฏ€๋กœ ๋ฌด์กฐ๊ฑด ์™ธ๋ถ€๊ณต๊ธฐ์ด๋‹ค. ๋”ฐ๋ผ์„œ (0,0)๋ถ€ํ„ฐ bfs๋ฅผ ๋Œ๋ฆฌ๋ฉด "์™ธ๋ถ€๊ณต๊ธฐ"์™€ "์น˜์ฆˆ&๋‚ด๋ถ€๊ณต๊ธฐ" ๋กœ ๋‚˜๋‰œ๋‹ค.

3. ๋…น์„ ์น˜์ฆˆ ํŒ๋‹จ

 ์™ธ๋ถ€๊ณต๊ธฐ์™€ ๋‚ด๋ถ€๊ณต๊ธฐ๊ฐ€ ํŒ๋‹จ๋˜๋ฉด, ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์‚ดํŽด ์™ธ๋ถ€๊ณต๊ธฐ๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ฉด  ์น˜์ฆˆ๋ฅผ ๋…น์ธ๋‹ค.

4. ๋ฐ˜๋ณต

๐Ÿ’ป์ฝ”๋“œ

# 2638 ์น˜์ฆˆ

from collections import deque

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

    for i in range(4):  # ์ƒํ•˜์ขŒ์šฐ ๊ณต๊ธฐ ์ฒดํฌ
        nx = x + dx[i]
        ny = y + dy[i]
        if nx < 0 or nx > (n-1) or ny < 0 or ny > (m-1):
            continue
        if air_graph[nx][ny] == 1:    # ์™ธ๋ถ€ ๊ณต๊ธฐ์ด๋ฉด cnt + 1
            cnt += 1
    if cnt > 1: # 1์‹œ๊ฐ„ ๋’ค ๋…น์„ ์น˜์ฆˆ๋ฉด
        graph[x][y] = 0 # ์น˜์ฆˆ ๋…น์ด๊ธฐ
        return True
    return False



# ์™ธ๋ถ€ ๊ณต๊ธฐ ์ „๋ถ€ 1๋กœ ํ‘œ์‹œ
def Air():
    deq = deque()
    deq.append([0,0])
    air_graph[0][0] = 1
    dx = [0,0,-1,1]
    dy = [-1,1,0,0]

    while deq:
        x,y = deq.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or nx > (n-1) or ny < 0 or ny > (m-1):
                continue
            if graph[nx][ny] == 0 and air_graph[nx][ny] == 0:
                air_graph[nx][ny] = 1
                deq.append([nx,ny])
    return
    


# 1. ์ž…๋ ฅ ๋ฐ›๊ธฐ
n,m = map(int,input().split())

graph = []
for i in range(n):
    graph.append(list(map(int,input().split())))

time = 0
cheese = True

while cheese:   # ์น˜์ฆˆ๊ฐ€ ๋…น์„ ๋•Œ๋งˆ๋‹ค ์™ธ๋ถ€/๋‚ด๋ถ€๊ณต๊ธฐ๊ฐ€ ๋ฐ”๋€œ
    cheese = False
    air_graph = [[0 for j in range(m)] for i in range(n)] # ๋‚ด๋ถ€ / ์™ธ๋ถ€ ๊ณต๊ธฐ ํŒ๋‹จ
    Air()   # ๊ฐ€์žฅ์ž๋ฆฌ๋Š” ์™ธ๋ถ€๊ณต๊ธฐ๋‹ˆ๊นŒ ๊ฐ€์žฅ์ž๋ฆฌ๋ถ€ํ„ฐ bfs ๋Œ๋ ค๋ฒ„๋ฆฌ๋ฉด ๋‹ค ์™ธ๋ถ€๊ณต๊ธฐ์ธ 1๋กœ ์ฑ„์›Œ์ง
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1:    # ์น˜์ฆˆ๋ฅผ ๋งŒ๋‚˜๋ฉด
                if Check(i,j):   # ํ•œ ์‹œ๊ฐ„ ๋’ค ๋…น์„ ์น˜์ฆˆ์ธ์ง€ ํŒ๋‹จํ•˜๊ณ  ๋…น์ด๊ธฐ
                    cheese = True   # ์น˜์ฆˆ ํ•˜๋‚˜๋ผ๋„ ๋…น์œผ๋ฉด True
    if cheese:  # ์น˜์ฆˆ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ๋…น์•˜์œผ๋ฉด
        time += 1   # ์‹œ๊ฐ„ ์ถ”๊ฐ€

print(time)

๐ŸŽ„์ฝ”๋“œ ์„ค๋ช…

์œ„์˜ ์ฝ”๋“œ์™€ ์ฃผ์„์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.