๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€

[๋ฐฑ์ค€] 14502 ์—ฐ๊ตฌ์†Œ (ํŒŒ์ด์ฌ/python)

by chjcoder 2023. 9. 25.

๐ŸŽˆ๋ฌธ์ œ

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

 

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

bfs, ๋ฐฑํŠธ๋ž˜ํ‚น

 

1. ๋ฒฝ์„ ์ข€ ๋” ํšจ๊ณผ์ ์œผ๋กœ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณธ๋‹ค.

2 . ์—†์œผ๋ฉด ๋ฒฝ์„ ์ผ์ผ์ด ์„ธ์›Œ๋ณด๋ฉฐ ์–ด๋””์— ์„ธ์› ์„ ๋•Œ ์•ˆ์ „ ์˜์—ญ์ด ๊ฐ€์žฅ ํด์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋”ฐ์ ธ๋ณด์•„์•ผ ํ•œ๋‹ค.

3. ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋”ฐ์งˆ ๋•Œ๋Š” ํŒŒ์ด์ฌ ๋‚ด์žฅํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•๊ณผ ๋ฐฑํŠธ๋ž˜ํ‚น์ด ์žˆ๋Š”๋ฐ, ์กฐ๊ฑด์ด ๊นŒ๋‹ค๋กœ์šด ๊ฒฝ์šฐ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์‚ฌ์šฉํ•œ๋‹ค.

4. ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์‚ฌ์šฉํ•ด ๋นˆ ์˜์—ญ๋งˆ๋‹ค ๋ฒฝ์„ ์„ธ์›Œ๋ณด๋ฉฐ ์•ˆ์ „ ์˜์—ญ์ด ์–ผ๋งˆ๋‚˜ ๋‚จ๋Š”์ง€ bfs()๋ฅผ ๋Œ๋ ค๋ณธ๋‹ค.

5. bfs๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ณ , dfs๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, bfs๋ฅผ ์„ ํ˜ธํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

6. bfs ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผํŠธ๋ฆฌ๊ณ  ๋™์‹œ์— ํผํŠธ๋ฆด ๋•Œ๋งˆ๋‹ค cnt += 1 ํ•ด์ฃผ๋ฉฐ ํผํŠธ๋ฆฐ ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด์ค€๋‹ค.

7. bfs๋ฅผ ๋Œ๋ฆฌ๊ณ  ๋‚œ ๋’ค(๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผํŠธ๋ฆฌ๊ณ ๋‚œ ๋’ค)์˜ ์•ˆ์ „ ์˜์—ญ = ํผํŠธ๋ฆฌ๊ธฐ ์ „ ์•ˆ์ „์˜์—ญ(safe_area) - ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง„ ์˜์—ญ(cnt) - 3(๋ฒฝ 3๊ฐœ)

8. bfs๋ฅผ ๋Œ๋ฆฌ๊ณ  ๋‚œ ๋’ค์˜ ์•ˆ์ „์˜์—ญ์„ ๊ธฐ์กด์˜ ๊ฐ’(answer)๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฐ€์žฅ ๋„“์€ ์˜์—ญ์˜ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

 

๐Ÿ’ป์ฝ”๋“œ

# 14502 ์—ฐ๊ตฌ์†Œ

from collections import deque

# ๋ฒฝ์„ธ์šฐ๋Š” ํ•จ์ˆ˜, ๋ฐฑํŠธ๋ž˜ํ‚น
def makeWall(cnt):
    global answer
    if cnt == 3:
        answer = max(answer,bfs())
        return

    for i in range(n):
        for j in range(m):
            if graph[i][j] == 0:
                graph[i][j] = 1
                makeWall(cnt+1)
                graph[i][j] = 0

# bfs
def bfs():
    temp = [t[:] for t in graph] # graph ๋ณต์‚ฌ
    deq = deque()
    dx = [0,0,-1,1]
    dy = [-1,1,0,0]
    
    for i in range(n):  # 2(๋ฐ”์ด๋Ÿฌ์Šค)์˜ ์œ„์น˜ ์ •๋ณด ์ˆ˜์ง‘
        for j in range(m):
            if temp[i][j] == 2:
                deq.append([i,j])
    
    cnt = 0 # ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง„ ์˜์—ญ์˜ ๊ฐœ์ˆ˜
    while deq:  # bfs๋Œ๋ ค์„œ ๋ฐ”์ด๋Ÿฌ์Šค ํผํŠธ๋ฆฌ๋ฉด์„œ ํผํŠธ๋ฆฐ ๋ฉด์  ๊ณ„์‚ฐ
        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 temp[nx][ny] == 0:
                temp[nx][ny] = 2
                cnt += 1
                deq.append([nx,ny])

    # ๋‚จ์€ safe_area ๊ฐœ์ˆ˜ ๋ฐ˜ํ™˜
    return safe_area-cnt-3  # ์ฒ˜์Œ safe_area์˜ ๋ฉด์  - ๋ฐ”์ด๋Ÿฌ์Šค ํผ์ง„ ๋ฉด์  - ๋ฒฝ 3๊ฐœ

                


# ์ž…๋ ฅ ๋ฐ›๊ธฐ
n,m = map(int,input().split())
graph = [list(map(int,input().split())) for _ in range(n)]

# ์ฒ˜์Œ safe_area์˜ ๊ฐœ์ˆ˜
safe_area = 0
for i in range(n):
    for j in range(m):
        if graph[i][j] == 0:
            safe_area += 1

# ๋ฒฝ ์„ธ์šฐ๊ณ  ์•ˆ์ „ ์˜์—ญ ํฌ๊ธฐ ํ™•์ธํ•˜๊ธฐ
answer = 0
makeWall(0)

print(answer)

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

์ฃผ์„๊ณผ ์œ„์˜ ์„ค๋ช…์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.