๊ด€๋ฆฌ ๋ฉ”๋‰ด

๊ฐœ๋ฐœ์•ผ์˜น

[Beakjoon][14502] ๊ณจ๋“œ4 ์—ฐ๊ตฌ์†Œ - Python ๋ณธ๋ฌธ

Algorithm\CodingTest/Baekjoon

[Beakjoon][14502] ๊ณจ๋“œ4 ์—ฐ๊ตฌ์†Œ - Python

kitez 2024. 10. 8. 01:45

๐Ÿ”ฌ ์—ฐ๊ตฌ์†Œ

  • ์‹œ๊ฐ„์ œํ•œ: 2์ดˆ
  • ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ: 512MB

๐Ÿ“„ ๋ฌธ์ œ

  • ์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์•„์ง ํผ์ง€์ง€ ์•Š์•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค์˜ ํ™•์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์—ฐ๊ตฌ์†Œ์— ๋ฒฝ์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค.
  • ์—ฐ๊ตฌ์†Œ๋Š” ํฌ๊ธฐ๊ฐ€ N x M์ธ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง์‚ฌ๊ฐํ˜•์€ 1 x 1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ๋นˆ ์นธ, ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๋ฒฝ์€ ์นธ ํ•˜๋‚˜๋ฅผ ๊ฐ€๋“ ์ฐจ์ง€ํ•œ๋‹ค.
  • ์ผ๋ถ€ ์นธ์€ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋นˆ ์นธ์œผ๋กœ ๋ชจ๋‘ ํผ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒˆ๋กœ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š” ๋ฒฝ์˜ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ์ด๋ฉฐ, ๊ผญ 3๊ฐœ๋ฅผ ์„ธ์›Œ์•ผ ํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฐ๊ตฌ์†Œ๊ฐ€ ์ƒ๊ธด ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

  • ์ด๋•Œ, 0์€ ๋นˆ ์นธ, 1์€ ๋ฒฝ, 2๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ๊ณณ์ด๋‹ค. ์•„๋ฌด๋Ÿฐ ๋ฒฝ์„ ์„ธ์šฐ์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ๋ชจ๋“  ๋นˆ ์นธ์œผ๋กœ ํผ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
  • 2ํ–‰ 1์—ด, 1ํ–‰ 2์—ด, 4ํ–‰ 6์—ด์— ๋ฒฝ์„ ์„ธ์šด๋‹ค๋ฉด ์ง€๋„์˜ ๋ชจ์–‘์€ ์•„๋ž˜์™€ ๊ฐ™์•„์ง€๊ฒŒ ๋œ๋‹ค.

  • ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง„ ๋’ค์˜ ๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™์•„์ง„๋‹ค.

  • ๋ฒฝ์„ 3๊ฐœ ์„ธ์šด ๋’ค, ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์งˆ ์ˆ˜ ์—†๋Š” ๊ณณ์„ ์•ˆ์ „ ์˜์—ญ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ์œ„์˜ ์ง€๋„์—์„œ ์•ˆ์ „ ์˜์—ญ์˜ ํฌ๊ธฐ๋Š” 27์ด๋‹ค.
  • ์—ฐ๊ตฌ์†Œ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ ์˜์—ญ ํฌ๊ธฐ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

  • ์ฒซ์งธ ์ค„์— ์ง€๋„์˜ ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค.( 3 <= N, M <= 8)
  • ๋‘˜์งธ ์ค„ ๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ง€๋„์˜ ๋ชจ์–‘์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ์นธ, 1์€ ๋ฒฝ, 2๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์œ„์น˜์ด๋‹ค.
  • 2์˜ ๊ฐœ์ˆ˜๋Š” 2๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.
  • ๋นˆ ์นธ์˜ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ ์ด์ƒ์ด๋‹ค.

์ถœ๋ ฅ

  • ์ฒซ์งธ ์ค„์— ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ ์˜์—ญ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ’ก ๋ฌธ์ œ ์•„์ด๋””์–ด

  • bfs/dfs๋ฌธ์ œ ์ธ ๊ฒƒ ๊ฐ™์€๋ฐ ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ• ์ง€ ๊ฐ์ด ์˜ค์ง€ ์•Š์•„์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ’€์ด์—์„œ ์ฃผ์„์„ ํ†ตํ•ด ๋กœ์ง๋งŒ ์ฐธ๊ณ 
    1. ํ•˜๋‚˜์”ฉ ํŽœ์Šค๋ฅผ ์นœ๋‹ค.
      • ํŽœ์Šค๊ฐ€ 3๊ฐœ๊ฐ€ ๋˜๋ฉด ๋ฐ”์ด๋Ÿฌ์Šค ์ „ํŒŒํ•ด์„œ ์•ˆ์ „์˜์—ญ ์„ผ๋‹ค.
      • 3๊ฐœ ๋ฏธ๋งŒ์ด๋ฉด ํŽœ์Šค ๊ณ„์† ์น˜๊ธฐ

โœ… ์ •๋‹ต ์ฝ”๋“œ (ํ’€์ด ์ฐธ๊ณ  + GPT ํ™œ์šฉ)

# ์—ฐ๊ตฌ์†Œ
from sys import stdin
from collections import deque
import copy

input = stdin.readline

# ์„ธ๋กœ, ๊ฐ€๋กœ ์ž…๋ ฅ
N, M = map(int, input().split())

# ์—ฐ๊ตฌ์†Œ ์ง€๋„ ์ž…๋ ฅ
lab = [list(map(int, input().split())) for _ in range(N)]

# ๋ฐ”์ด๋Ÿฌ์Šค ์œ„์น˜ ์ €์žฅ
viruses = []

# ๋นˆ๊ณณ ์œ„์น˜ ์ €์žฅ
empty_spaces = []

for i in range(N):
    for j in range(M):
        if lab[i][j] == 2:
            viruses.append((i, j))
        elif lab[i][j] == 0:
            empty_spaces.append((i, j))

# ์•ˆ์ „์˜์—ญ ์ตœ๋Œ€๊ฐ’ ์ €์žฅ
max_safe = -1

def virus_and_return_safe():
    global result
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
    temp_lab = copy.deepcopy(lab)
    queue = deque(viruses)

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

        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if 0 <= nx < N and 0 <= ny < M and temp_lab[nx][ny] == 0:
                temp_lab[nx][ny] = 2
                queue.append((nx, ny))
    cnt = 0
    for i in range(N):
        cnt += temp_lab[i].count(0)

    result = max(result, cnt)



def make_wall(cnt, index):
    if cnt == 3:
        virus_and_return_safe()
        return
    for i in range(index, len(empty_spaces)):
        x, y = empty_spaces[i]
        lab[x][y] = 1
        make_wall(cnt + 1, i + 1)
        lab[x][y] = 0 # ๋ฐฑํŠธ๋ž˜ํ‚น
result = 0
make_wall(0, 0)
print(result)
728x90