์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ) Lv2. ์ง€๊ฒŒ์ฐจ์™€ ํฌ๋ ˆ์ธ [ python, bfs ]

proggg 2025. 4. 16. 21:40
728x90

 


๋ถ„๋ฅ˜ : bfs, ์•ฝ๊ฐ„ ๊ตฌํ˜„

 


keypoint : storage ํ…Œ๋‘๋ฆฌ๋ฅผ 0์œผ๋กœ ์ฑ„์šฐ๊ธฐ

๊ธฐ๋ณธ ๋ฐฐ์—ด์— 0์œผ๋กœ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋‘˜๋Ÿฌ์ค˜์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์˜์—ญ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.


code

def fork(storage, box): # ์ง€๊ฒŒ์ฐจ
    dx, dy = [0, 0, 1, -1], [1, -1, 0, 0]
    index = []
    
    for i in range(1, len(storage)-1):
        for j in range(1, len(storage[0])-1):
            if storage[i][j] == box:
                for k in range(4):
                    nx, ny = i + dx[k], j + dy[k]
                    if storage[nx][ny] == "0":  # ์ง€๊ฒŒ์ฐจ๋กœ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉด (์™ธ๋ถ€์ชฝ ๋ฐ•์Šค)
                        index.append((i, j))    # ์œ„์น˜ ์ €์žฅ(๋ฐ”๋กœ ๊บผ๋‚ด๋ฉด ์˜†์—์žˆ๋Š” ๋ฐ•์Šค๋„ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋จ)
                        break
    
    for i, j in index:  # ์ €์žฅ๋œ ๋ฐ•์Šค ๊บผ๋‚ด๊ธฐ
        storage[i][j] = "0"
        isOutside(storage, i, j) # ์ฃผ๋ณ€์— ๋นˆ ๊ณต๊ฐ„์žˆ์œผ๋ฉด ์™ธ๋ถ€๋ž‘ ์—ฐ๊ฒฐ

def crane(storage, box): # ํฌ๋ ˆ์ธ
    for i in range(1, len(storage)-1):
        for j in range(1, len(storage[0])-1):
            if storage[i][j] == box:
                storage[i][j] = "1"
                isOutside(storage, i, j) # ์ฃผ๋ณ€์— ๋นˆ ๊ณต๊ฐ„์žˆ์œผ๋ฉด ์™ธ๋ถ€๋ž‘ ์—ฐ๊ฒฐ

def isOutside(storage, x, y):   # ๋ฐ•์Šค ๊บผ๋ƒˆ์„ ๋•Œ ์™ธ๋ถ€๋ž‘ ์—ฐ๊ฒฐ๋œ ๊ณต๊ฐ„ ์ฐพ์•„์„œ ์—ฐ๊ฒฐ
    dx, dy = [0, 0, 1, -1], [1, -1, 0, 0]
    outside = False

    for i in range(4):
        nx, ny = x + dx[i], y + dy[i]
        if storage[nx][ny] == "0":  # ์™ธ๋ถ€๋ž‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด
            storage[x][y] = "0"
            outside = True         
            break
    
    if outside:
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if storage[nx][ny] == "1":  # ๋นˆ ๊ณต๊ฐ„์„ ์™ธ๋ถ€๋ž‘ ์—ฐ๊ฒฐ "1" -> "0"
                storage[nx][ny] = "0"
                isOutside(storage, nx, ny)  # ๋ถ™์–ด์žˆ๋Š” ๋นˆ ๊ณต๊ฐ„์„ ๋” ์ฐพ๊ธฐ

def solution(storage, requests):
    answer = 0
    # 0 = ์™ธ๋ถ€๋ž‘ ์—ฐ๊ฒฐ๋œ ๊ณณ, 1 = ์‚ฌ๋ฐฉ์ด ๋ง‰ํžŒ ๋นˆ ๊ณต๊ฐ„
    storage = [list("0" + i + "0") for i in storage]    # ํ…Œ๋‘๋ฆฌ๋ฅผ "0"์œผ๋กœ ์ฑ„์šฐ๊ธฐ
    storage.insert(0, list("0" * len(storage[0])))
    storage.append(list("0" * len(storage[0])))

    for q in requests:
        if len(q) == 1:
            fork(storage, q)
        else:
            crane(storage, q[0])
    
    for i in range(1, len(storage)-1):
        for j in range(1, len(storage[0])-1):
            if storage[i][j] not in ["0", "1"]:
                answer += 1
    
    return answer

์ค‘์š”ํ•œ ๋‚ด์šฉ lambda 

 

# N×N 2์ฐจ์› ๋ฐฐ์—ด

dy = (-1, 0, 1, 0)
dx = (0, 1, 0, -1)

# ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ True / ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ False
visited = [[False for _ in range(N)] for _ in range(N)]


def BFS(r, c):
    q = deque()  # ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ๋“ค์„ ๋‹ด๋Š” ํ
    
    # ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๋Š” ๋…ธ๋“œ (r, c)
    q.append((r, c))
    visited[r][c] = True
    
    route = []  # ํƒ์ƒ‰ ๊ฒฝ๋กœ ์ €์žฅ
    route.append((r, c))

    # ํ์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€(ํƒ์ƒ‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€) ๋ฐ˜๋ณต
    while q:
        # ํ˜„์žฌ ํƒ์ƒ‰ ์ค‘์ธ ๋…ธ๋“œ (y, x)
        y, x = q.popleft()
        
        for i in range(4):
            # ์ธ์ ‘ ๋…ธ๋“œ (ny, nx)
            ny = y + dy[i]
            nx = x + dx[i]
            
            # ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ์ธ์ง€ ํ™•์ธ
            if 0 <= ny < N and 0 <= nx < N and not visited[ny][nx]:
                visited[ny][nx] = True
                q.append((ny, nx))  # ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ์ „๋ถ€ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ํ์— ๋‹ค์‹œ append
                route.append((ny, nx))
                
    return route

 

728x90