๋ฌธ์
https://www.acmicpc.net/problem/18809
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x0C๊ฐ - ๋ฐฑํธ๋ํน
์๊ณ ๋ฆฌ์ฆ: ๊ทธ๋ํ, ๋ธ๋ฃจํธํฌ์ค, ๋ฐฑํธ๋ํน, BFS, ์๋ฎฌ๋ ์ด์
ํ์ด
BOJ ๋ง์์์๋ ์ง์ ์ฌ๋์ด ์จ์์ ์ฌ๋ ๋์ ์ด๋ก์ ๋ฐฐ์์ก๊ณผ ๋นจ๊ฐ์ ๋ฐฐ์์ก์ ๋ ์ ์ ์ ํ๊ฒ ๋ฟ๋ ค์ ๊ฝ์ ํผ์ธ ๊ฒ์ด๋ค. ์ด ๋ ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ๋ ์ ๋ฏธ๋ฆฌ ์ ํด์ ธ์๋ค.
๋ฐฐ์์ก์ ๋งค ์ด๋ง๋ค ์ด์ ์ ๋ฐฐ์์ก์ด ๋๋ฌํ ์ ์ด ์๋ ์ธ์ ํ ๋ ์ผ๋ก ํผ์ ธ๊ฐ๋ค.
์ด๋ก์ ๋ฐฐ์์ก๊ณผ ๋นจ๊ฐ์ ๋ฐฐ์์ก์ด ๋์ผํ ์๊ฐ์ ๋๋ฌํ ๋ ์์๋ ๋ ๋ฐฐ์์ก์ด ํฉ์ณ์ ธ์ ๊ฝ์ด ํผ์ด๋๋ค. ๊ฝ์ด ํผ์ด๋ ๋ ์์๋ ๋ฐฐ์์ก์ด ์ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ์ธ์ ํ ๋ ์ผ๋ก ๋ฐฐ์์ก์ ํผํธ๋ฆฌ์ง ์๋๋ค.
๋ฐฐ์์ก์ ๋ด์ด ์ง๋๋ฉด ์ฌ์ฉํ ์ ์๊ฒ ๋๋ฏ๋ก ์ฃผ์ด์ง ๋ชจ๋ ๋ฐฐ์์ก์ ๋จ๊น์์ด ์ฌ์ฉํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด ์ด๋ก์ ๋ฐฐ์์ก 2๊ฐ์ ๋นจ๊ฐ์ ๋ฐฐ์์ก 2๊ฐ๊ฐ ์ฃผ์ด์ก๋๋ฐ ์ด๋ก์ ๋ฐฐ์์ก 1๊ฐ๋ฅผ ๋ ์ ๋ฟ๋ฆฌ์ง ์๊ณ , ์ด๋ก์ ๋ฐฐ์์ก 1๊ฐ์ ๋นจ๊ฐ์ ๋ฐฐ์์ก 2๊ฐ๋ง์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
๋ํ ๋ชจ๋ ๋ฐฐ์์ก์ ์๋ก ๋ค๋ฅธ ๊ณณ์ ๋ฟ๋ ค์ ธ์ผ ํ๋ค.
์ ์๊ณผ ๋ ๋ฐฐ์์ก์ ๊ฐ์๊ฐ ์ฃผ์ด์ ธ์์ ๋ ํผ์ธ ์ ์๋ ๊ฝ์ ์ต๋ ๊ฐ์๋ฅผ ๊ตฌํด๋ณด์.
์ด ๋ฌธ์ ... ๋๋ฅผ ํผ๋์ ๋น ๋จ๋ ธ๋ ๋ฌธ์ ๋ค...
(์ฆ๊ฑฐ)

๋ฐฑํธ๋ํน ๋ฌธ์ ์ด์ง๋ง ๋ฐฑํธ๋ํน์ ์ฌ์ฉํ์ง ์๊ณ ํ์๋ค...
๋จผ์ ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ๋
์ ์ขํ๋ฅผ possible์ ๋ฐ๋ก ์ ์ฅํด๋๋ค.
๊ทธ๋ฆฌ๊ณ combinations๋ชจ๋์ ์ฌ์ฉํด ์กฐํฉ์ ๊ตฌํ๋ค.
์ด๋ก์/๋นจ๊ฐ์ ๋ฐฐ์์ก์ ๋จ๊น์์ด ๋ชจ๋ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก G + R๋งํผ์ ์กฐํฉ์ ์์ฑํ๋ค.
์์ฑ๋ ์กฐํฉ์ผ๋ก G๊ฐ ๋งํผ์ ์กฐํฉ์ ๋ ์์ฑํ๋ค. ์ด๋ก์ ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ์กฐํฉ์ด๋ค.
๋นจ๊ฐ์ ๋ฐฐ์์ก์ ์กฐํฉ์ G + R ์กฐํฉ์์ G ์กฐํฉ์ ์ ์ธํ ๋๋จธ์ง ์กฐํฉ์ด ๋๊ฒ ๋ค.
์ด๋ก์ ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ์ขํ green, ๋นจ๊ฐ์ ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ์ขํ red๋ฅผ ๊ฐ์ง๊ณ bfs๋ฅผ ์์ํ๋ค.visited๋ฅผ N x M ํฌ๊ธฐ๋งํผ ์์ฑํ๊ณ , green๊ณผ red๋ฅผ ์ฒดํฌํ๋ค.
๋ ๋ฐฐ์์ก์ด ๋ง๋ ๊ฝ์ ํผ์ธ ์ ์์ผ๋ ค๋ฉด '๋์ผํ ์๊ฐ'์ ๊ฐ์ ์ฅ์์ ๋๋ฌํด์ผํ๋ค.
๋ฐ๋ผ์ visited์๋ (์์ ๊ตฌ๋ณํ ๊ฐ, ์๊ฐ)์ด ์ ์ฅ๋ ๊ฒ์ด๋ค.
(์์๋ก green์ 1, red๋ -1๋ก ์ ์ฅํ๋ค.)
green๊ณผ red๋ฅผ ์ํํ๋ฉฐ ๊ฐ ์ขํ์ ํด๋น ์๊น, 0(์ด๊ธฐ์๊ฐ)์ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ์๋ (x, y, ์๊น, ์๊ฐ)์ ์ถ๊ฐํ๋ค.
์ด๊ธฐ์
ํ
์ด ๋๋๋ฉด ๋ณธ๊ฒฉ์ ์ผ๋ก ํ์์ ์์ํ๋๋ฐ, ๊ฝ์ด ๋ ๊ฒฝ์ฐ๋ฅผ ์ ๋๋ก ์ฒดํฌํด์ผํ๋ค.
๋๋ green๋ถํฐ ํ์ ๋ฃ์๊ธฐ๋๋ฌธ์ green -> red -> green... ์์ผ๋ก ์งํ๋ ๊ฒ์ด๋ค.
์ด๋ก์ ๋ฐฐ์์ก์ (x, y)์ ๋ฟ๋ฆฐ ํ ํ์ ์ถ๊ฐํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ด๋ก์์ ํด์ด ๋๋๋ฉด ๋นจ๊ฐ์ ๋ฐฐ์์ก์ด (x, y)๋ฅผ ๋ฐ๊ฒฌํ๊ณ ํด๋น ์ขํ๋ฅผ ๊ฝ์ผ๋ก ๋ณ๊ฒฝํ ๊ฒ์ด๋ค.
๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ๊ฝ์ผ๋ก ๋ณํ ํ์๋ ์ธ์ ํ ๋
์ผ๋ก ๋ฐฐ์์ก์ ํผ๋จ๋ฆด ์ ์๋ค.
๋ฐ๋ผ์ ์ด๋ฏธ ํ์ ๋ค์ด๊ฐ์๋ (x, y)๋ ๊ฝ์ด ๋ ์ขํ์ด๋ฏ๋ก passํด์ผํ๋ค.
์ฆ, 1) ํ์ฌ ์ขํ๊ฐ ์ด๋ฏธ ๊ฝ์ธ์ง ๋จผ์ ์ฒดํฌํด์ผํ๋ค.
๊ทธ ๋ค 2) ๋์๋จ๋ถ์ผ๋ก ํ์ฅํ ์ขํ๊ฐ ํธ์๊ฐ ์๋์ง ํ์ธํ๋ค.
ํธ์๊ฐ ์๋ ๋
์ด๋ผ๋ฉด 3-1) ๋ฐฉ๋ฌธํ์ง ์์ ๋
์ธ์ง, 3-2) ๊ฐ์ ์๊ฐ์ ๋ค๋ฅธ ์ ๋ฐฐ์์ก์ด ๋ฐฉ๋ฌธํ์๋์ง ์ฒดํฌํ๋ค.
๋ฐฉ๋ฌธํ์ง ์์ ๋
์ด๋ผ๋ฉด (ํ์ฌ ์๊น, ํ์ฌ ์๊ฐ+1)์ visited์ ์ ์ฅํ๊ณ ํ์ ์ถ๊ฐํ๋ค.
์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ํ๋ผ๋ฉด visited์ ๊ฐ์ด (-ํ์ฌ ์๊น, ํ์ฌ ์๊ฐ+1)์ธ์ง ํ์ธ ํ ๊ฝ์ ๊ฐฏ์๋ฅผ ์
๋ฐ์ดํธํ๋ค. ํ๋ ๊ฑด๋๋ด๋ค!
์ฐธ๊ณ ๋ก ์ด ๋ฌธ์ ๋ Python3๊ฐ ์๋ PyPy3๋ก ํต๊ณผํ๋ค.
์ ์ฒด ์ฝ๋
# PyPy3๋ก ํต๊ณผํ ์ฝ๋.
# ๋ฉ๋ชจ๋ฆฌ: 142476KB / ์๊ฐ: 1652ms
from sys import stdin
from itertools import combinations
from collections import deque
input = stdin.readline
def bfs(green, red):
visited = [[0] * M for _ in range(N)]
queue = deque()
flowers = 0
for gx, gy in green:
visited[gx][gy] = (1, 0)
queue.append((gx, gy, 1, 0))
for rx, ry in red:
visited[rx][ry] = (-1, 0)
queue.append((rx, ry, -1, 0))
while queue:
x, y, color, time = queue.popleft()
if visited[x][y] == -1: # ํ์ฌ ์ขํ๊ฐ ๊ฝ์ด๋ผ๋ฉด continue
continue
for i in range(4):
nx = dx[i] + x
ny = dy[i] + y
if 0 <= nx < N and 0 <= ny < M and garden[nx][ny] != 0:
if visited[nx][ny] == 0: # ๋ฐฉ๋ฌธํ์ง ์์ ์ขํ๋ผ๋ฉด ์งํ
visited[nx][ny] = (color, time+1)
queue.append((nx, ny, color, time+1))
elif visited[nx][ny] == (-color, time+1): # ๋ค๋ฅธ ๋ฐฐ์์ก์ด ๋ฟ๋ ค์ง ์ขํ๋ผ๋ฉด ๊ฝ์ผ๋ก ์
๋ฐ์ดํธ
visited[nx][ny] = -1
flowers += 1
return flowers
N, M, G, R = map(int, input().split())
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
garden = []
possible = []
max_flowers = 0
for i in range(N):
line = list(map(int, input().split()))
for j in range(M):
if line[j] == 2: # ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ์ขํ๋ง ๋ฐ๋ก ์ ์ฅ
possible.append((i, j))
garden.append(line)
for comb in combinations(possible, G+R):
for green_comb in combinations(comb, G):
green = list(green_comb) # ๋ง๋ค ์ ์๋ ์ด๋ก์ ๋ฐฐ์์ก ์ขํ
red = [c for c in comb if c not in green] # ๋นจ๊ฐ์ ๋ฐฐ์์ก ์ขํ
max_flowers = max(bfs(green, red), max_flowers)
print(max_flowers)
Python3๋ก ํต๊ณผํ ํ์ด ์์ฒด๊ฐ ๋ณ๋ก ์๋ค.
ํคํฌ์ธํธ๋ ์กฐํฉ ์์ฑ ๋ฐฉ์์ธ๋ฏํ๋ฐ...
๋ฐฑํธ๋ํน์ผ๋ก ์กฐํฉ์ ์์ฑํ๋ฉด G, R ๊ฐฏ์์ ๋ง๊ฒ ์ฒดํฌํ๋ฉฐ ์งํํ๊ธฐ ๋๋ฌธ์ ๊ณ์ฐํ์๊ฐ ์ค์ด๋๋๋ฏํ๋ค.
combinations ๋ชจ๋๋ก ์กฐํฉ์ ์์ฑํ๊ฒ ๋๋ฉด G + R๊ฐ์ ๋ชจ๋ ์กฐํฉ์ ์์ฑ ํ ์ด๋ก์/๋นจ๊ฐ์์ ๋๋๊ฒ๋๋ค.
๋ฐ๋ผ์ ์์๋ง ๋ฐ๋ ์กฐํฉ์ด ์ฌ๋ฌ๋ฒ ๋ฐ์ํ ์ ์๋ค.
๋ง์ฝ ๋ฐฐ์์ก์ ๋ฟ๋ฆด ์ ์๋ ์ขํ๊ฐ ์๋์ ๊ฐ๋ค๊ณ ์๊ฐํด๋ณด์.
[(0, 0), (1, 1), (2, 2)]
๊ทธ๋ฆฌ๊ณ G = 1, R = 1๋ผ๊ณ ํ์๋ combinations๋ก ์์ฑ๋ G + R ์กฐํฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
[(0, 0), (1, 1)], [(0, 0), (2, 2)], [(1, 1), (2, 2)]
์ฌ๊ธฐ์ ๋ ํ๋ฒ G๊ฐ๋งํผ ์ด๋ก์ ๋ฐฐ์์ก ์กฐํฉ์ ์์ฑํ๊ฒ ๋๊ณ , ๋๋จธ์ง๋ฅผ ๋นจ๊ฐ์ ๋ฐฐ์์ก์ผ๋ก ์ง์ ํ๋ ๋ฐฉ์์ด๋ค.
๊ทธ๋ผ ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ก: (0, 0), ๋นจ๊ฐ: (1, 1)
์ด๋ก: (1, 1), ๋นจ๊ฐ: (0, 0)
์๋ง ๋ค๋ฅผ๋ฟ ์๋ฎฌ๋ ์ด์ ์ ๊ฐ์ ์ผ์ด์ค๊ฐ ๋ฐ์ํ๋๊ฒ์ด๋ค.
ํ๋ฐ, ๋๊ฐ์ด combinations๋ฅผ ๋๋ฒ ์ฌ์ฉํด์ ํ์๋๋ฐ๋ Python3๋ก ํต๊ณผํ ์ฝ๋๊ฐ ์๋ค;;
์ฌ์ค ์ฆ๊ฑฐ์ท์์ ์๊ฐ์ด๊ณผ๋ฌ์ฌ๊ฐ ๋ ์ด์ ๋ ์ด๊ฑฐ์๋ค. ๋ก์ง์ ๊ฐ์๋ฐ ์ ๋ด๊ป ์๋๋์ง ์ดํด๊ฐ ์๊ฐ์ ๋ฌดํ์ ์ถ์ ๋ฐ๋ณตํ๋ค.
์ด์ ๋ ์์ง๋ ์์ง๋ชปํจ. Help!