[BOJ] 18809. Gaaaaaaaaaarden (๐Ÿฅ‡, ๊ตฌํ˜„/์‹œ๋ฎฌ๋ ˆ์ด์…˜/BFS)

lemythe423ยท2023๋…„ 9์›” 16์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
50/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

  • ๋ฐฐ์–‘์•ก์„ ๋ฟŒ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ณณ์— ๋ชจ๋“  ๋ฐฐ์–‘์•ก์„ ๋ฟŒ๋ฆฐ๋‹ค
  • ๋ฐฐ์–‘์•ก์€ ๊ฐ๊ฐ 1์นธ์”ฉ ์ƒํ•˜์ขŒ์šฐ๋กœ ํผ์งˆ ์ˆ˜ ์žˆ๋‹ค
  • ์„œ๋กœ ๋‹ค๋ฅธ ์ƒ‰์˜ ๋ฐฐ์–‘์•ก์ด ๋™์‹œ์— ๋„์ฐฉํ•˜๋Š” ์นธ์€ ๊ฝƒ์ด ํ•€๋‹ค
  • ๊ฝƒ์ด ํ•€ ์นธ์€ ๋” ์ด์ƒ ํผ์ง€์ง€ ์•Š๋Š”๋‹ค
  • ํ˜ธ์ˆ˜์—๋Š” ๋ฐฐ์–‘์•ก์ด ํผ์งˆ ์ˆ˜ ์—†๋‹ค

๋ฐฐ์–‘์•ก์„ ๋ฟŒ๋ฆด ์ˆ˜ ์žˆ๋Š” ์นธ K(<=10)์นธ ์ค‘์—์„œ (R+G)์นธ๋งŒ ๊ณจ๋ผ๋‚ด๋Š” ์ค‘๋ณต์กฐํ•ฉ์ด๋‹ค. ์ตœ๋Œ€ 10์นธ๊นŒ์ง€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ณ  R๊ณผ G๋Š” ๊ฐ๊ฐ ์ตœ๋Œ€ 5์นธ์ด๋ฏ€๋กœ 10!/(5!x5!) = 252๊ฐ€์ง€๊ฐ€ ์ตœ๋Œ€๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์–‘์•ก์„ ๋ฟŒ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•ด ๊ตฌํ•˜๊ณ  ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๊ฐ ๋ฐฐ์–‘์•ก์ด ํผ์กŒ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

๊ฐ™์€ ์‹œ๊ฐ„์— ๊ฐ™์€ ์นธ์— ๋„์ฐฉํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ดˆ๋ก์ƒ‰๊ณผ ๋นจ๊ฐ„์ƒ‰์˜ ๋ฐฐ์–‘์•ก์— ๋Œ€ํ•ด ๊ฐ๊ฐ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ, ๋นˆ์นธ์— ๋„๋‹ฌํ•œ๋‹ค๋ฉด ๋„๋‹ฌํ•œ ๋ฐฐ์–‘์•ก์˜ ๋ฐ”๋กœ ์ €์žฅํ•˜์ง€๋งŒ, ์ดˆ๋ก์ƒ‰ ๋ฐฐ์–‘์•ก์ผ ๋•Œ ๋นจ๊ฐ„์ƒ‰ ์นธ์ด๊ฑฐ๋‚˜, ๋นจ๊ฐ„์ƒ‰ ๋ฐฐ์–‘์•ก์ผ ๋•Œ ์ดˆ๋ก์ƒ‰ ์นธ์ด๋ผ๋ฉด ๊ฐ ๋„๋‹ฌ์‹œ๊ฐ„์„ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค. ๋„๋‹ฌํ•œ ์‹œ๊ฐ„์ด ๋™์ผํ•˜๋‹ค๋ฉด ๊ฝƒ์„ ํ”ผ์šฐ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๋ƒฅ ์ง€๋‚˜๊ฐ„๋‹ค.

์ด๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€, ๋งŒ์•ฝ ํŠน์ • ๋ฐฐ์–‘์•ก์ด ๋„๋‹ฌํ–ˆ์„ ๋• ๋นˆ์นธ์ด์—ˆ์œผ๋‚˜ ๋’ค์ด์–ด ๋‹ค๋ฅธ ์ƒ‰์˜ ๋ฐฐ์–‘์•ก์ด ๊ทธ ์นธ์— ๋™์‹œ์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ๋Š” ํƒ์ƒ‰์„ ์œ„ํ•ด ํ์— ์ด๋ฏธ ์ถ”๊ฐ€๋œ ์นธ์ด ๋‚˜์ค‘์— ๊ฝƒ์ด ๋˜์–ด๋ฒ„๋ฆฐ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ์ด ์นธ์˜ ํƒ์ƒ‰์„ ์ค‘๋‹จ์‹œ์ผœ์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ดˆ๋ก์ƒ‰ ๋ฐฐ์–‘์•ก์ด ํŠน์ • ์นธ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ๋Š” ๋น„์–ด์žˆ์–ด์„œ ์ดˆ๋ก์ƒ‰ ์นธ์œผ๋กœ ๋ฌผ๋“ค์ด๊ณ  ๋’ค์ด์€ ํƒ์ƒ‰์„ ์œ„ํ•ด ํ์— ์ถ”๊ฐ€๊นŒ์ง€ ํ–ˆ๋Š”๋ฐ ๋’ค์ด์–ด ๋นจ๊ฐ„์ƒ‰ ๋ฐฐ์–‘์•ก์ด ๊ฐ™์€ ์‹œ๊ฐ„์ด ๋„๋‹ฌํ•ด๋ฒ„๋ฆฌ๋ฉด ํ์— ์ถ”๊ฐ€ํ–ˆ๋˜ ๊ทธ ์นธ์€ ๊ฝƒ์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ์—์„œ ๊บผ๋ƒˆ์„ ๋•Œ ํƒ์ƒ‰์„ ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฑธ ๋ชฐ๋ผ์„œ ์—„์ฒญ ํ—ค๋งธ๋‹ค.

์ฐธ๊ณ ๋กœ Python3๋กœ๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

# Gaaaaaaaaaarden

# ๋ฐฐ์–‘์•ก์„ ๋ฟŒ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋•… ์ฐพ๊ธฐ
def find_land(arr):
    queue = []
    for i in range(n):
        for j in range(m):
            if arr[i][j] == 2:
                queue.append((i, j))
    return queue

# ๋ฐฐ์–‘์•ก์„ ๋ฟŒ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ค‘๋ณต์กฐํ•ฉ ๊ตฌํ•˜๊ธฐ
def dfs(i, k, tmp, lst, comb):
    if len(tmp) == k:
        comb.append(tmp[:])
        return comb
    
    for j in range(i, len(lst)):
        if lst[j] not in tmp:
            tmp.append(lst[j])
            comb = dfs(j+1, k, tmp, lst, [row[:] for row in comb])
            tmp.remove(lst[j])
    return comb

# ๋ฐฐ์–‘์•ก ํผ๋œจ๋ฆฌ๊ธฐ
def bfs(green, red, medium_land):
    arr = [[[0, 0] for _ in range(m)] for _ in range(n)]
    queue = []
    for i in green:
        gx, gy = medium_land[i]
        arr[gx][gy] = [GREEN, 0]
        queue.append((gx, gy))
    for j in red:
        rx, ry = medium_land[j]
        arr[rx][ry] = [RED, 0]
        queue.append((rx, ry))

    flowers = 0
    while queue:
        x, y = queue.pop(0)

        # ํ˜„์žฌ ํƒ์ƒ‰ํ•˜๋ ค๋Š” ์นธ์ด ์ด๋ฏธ ๊ฝƒ์ด๋ผ๋ฉด ํƒ์ƒ‰ ๋ถˆ๊ฐ€
        if arr[x][y][0] == FLOWER:
            continue
        count = arr[x][y][1]
        for nx, ny in (x-1, y), (x+1, y), (x, y-1), (x, y+1):
            # ๋ฒ”์œ„์— ์†ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ˜ธ์ˆ˜์ด๊ฑฐ๋‚˜ ๊ฐ™์€ ์ƒ‰์˜ ๋ฐฐ์–‘์•ก์ด๊ฑฐ๋‚˜ ๊ฝƒ์ธ ๊ฒฝ์šฐ
            if not(-1<nx<n and -1<ny<m) or land[nx][ny] == 0 or arr[nx][ny][0] in (arr[x][y][0], 3):
                continue
                
            if arr[x][y][0] == GREEN:
                if arr[nx][ny][0] == RED and arr[nx][ny][1] == count+1:
                    arr[nx][ny][0] = FLOWER
                    flowers += 1
            elif arr[x][y][0] == RED:
                if arr[nx][ny][0] == GREEN and arr[nx][ny][1] == count+1:
                    arr[nx][ny][0] = FLOWER
                    flowers += 1
            if arr[nx][ny][0] == EMPTY:
                arr[nx][ny] = [arr[x][y][0], count+1]
                queue.append((nx, ny))

    return flowers

n, m, g, r = map(int, input().split())
land = [list(map(int, input().split())) for _ in range(n)]

medium_land = find_land(land)
combs, lst, max_result = [], range(len(medium_land)), 0
EMPTY, GREEN, RED, FLOWER = 0, 1, 2, 3
for green in dfs(0, g, [], lst, []):
    for red in dfs(0, r, [], [row for row in lst if row not in green], []):
        max_result = max(max_result, bfs(green, red, medium_land))

print(max_result)
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€