Algorithm

[BOJ] 15683๋ฒˆ ๊ฐ์‹œ - Python

lerrybe 2023. 7. 20. 14:36

๐Ÿฅธ ๋ฌธ์ œ

 

15683๋ฒˆ: ๊ฐ์‹œ

์Šคํƒ€ํŠธ๋งํฌ์˜ ์‚ฌ๋ฌด์‹ค์€ 1×1ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋Š” N×M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ๋ฌด์‹ค์—๋Š” ์ด K๊ฐœ์˜ CCTV๊ฐ€ ์„ค์น˜๋˜์–ด์ ธ ์žˆ๋Š”๋ฐ, CCTV๋Š” 5๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ๊ฐ CCTV๊ฐ€ ๊ฐ

www.acmicpc.net

 


๐Ÿฅณ ํ•ด์„ค ๋ฐ ํ’€์ด

input size๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด๋‹ˆ ๋ธŒ๋ฃจํŠธ ํฌ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์˜€๊ณ ,

4^8(๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜) * board์˜ ํฌ๊ธฐ (8 * 8) ์ •๋„๊ฐ€ ์ตœ๋Œ€ ๊ณ„์‚ฐ ๋นˆ๋„์ˆ˜ ์ •๋„์—ฌ์„œ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

์ „์ฒด ๊ฒฝ์šฐ์˜ ์ˆ˜(4๊ฐ€์ง€ ์ผ€์ด์Šค (๋™์„œ๋‚จ๋ถ) ** 8(CCTV์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜))๋ฅผ ์–ด๋–ป๊ฒŒ ๋‘๋ฉด ์ข‹์„์ง€ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, 

๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ทธ๋ƒฅ ์ˆซ์ž๋กœ ๊ฐ€์ •ํ•˜๊ณ  4^len(cctv) ๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค์คฌ๋”๋‹ˆ ํŽธํ•˜๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

ํ•ต์‹ฌ์€ ์•„๋ž˜์ฒ˜๋Ÿผ curr ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณต๋˜์ง€ ์•Š๊ฒŒ ์žฌ์กฐ์ • ํ•ด์ฃผ๋Š” ๊ณผ์ •์ด๋‹ค. (4๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ˆ 4์ง„๋ฒ•์œผ๋กœ ์ด์šฉํ•˜๋Š” ๋А๋‚Œ)

dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]  # ๋‚จ, ๋™, ๋ถ, ์„œ

# ...

for k in range(4^len(cctv))
    curr = k
    for i in range(len(cctv))
        d = curr % 4  # dx, dy์—์„œ์˜ ๋ฐฉํ–ฅ ์ค‘ ํ•˜๋‚˜ ์„ ํƒ
        
        # ... ๊ณ„์‚ฐ
        
        curr //= 4  # ๋‹ค์Œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์œ„ํ•œ curr ์กฐ์ •

 

 


๐Ÿˆ ์™„์„ฑ ์ฝ”๋“œ

n, m = map(int, input().split())

origin_board = [[0] * m for _ in range(n)]  # ์ตœ์ดˆ์— ์ž…๋ ฅ๋ฐ›์€ board๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
current_board = [[0] * m for _ in range(n)]  # ์‚ฌ๊ฐ ์ง€๋Œ€์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜

cctv = []  # cctv์˜ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜

dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]  # ๋‚จ, ๋™, ๋ถ, ์„œ

# -----------------------------------------------------------------------


def is_out_of_bound(x, y):  # Out Of Bounds ํ™•์ธ
    return x < 0 or x >= n or y < 0 or y >= m


# (x, y)์—์„œ d ๋ฐฉํ–ฅ์œผ๋กœ ๋ฒฝ์„ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ชจ๋“  ๋นˆ์นธ์„ 7๋กœ ๋ฐฉ๋ฌธํ‘œ์‹œ ํ•ด์คŒ
def update_board(x, y, d):
    d %= 4
    while True:
        x += dx[d]
        y += dy[d]
        if is_out_of_bound(x, y) or current_board[x][y] == 6:
            return  # ๋ฒฝ์„ ๋งŒ๋‚˜๊ฑฐ๋‚˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์„ ๋•Œ๋Š” ํƒ์ƒ‰ ์ค‘์ง€
        if current_board[x][y] != 0:
            continue  # ํ•ด๋‹น ์นธ์— cctv๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ๋„˜์–ด๊ฐ€๊ธฐ
        current_board[x][y] = 7  # ๋นˆ์นธ์„ 7๋กœ ๋ฎ์Œ


def solution():
    min_size = 0  # ์‚ฌ๊ฐ ์ง€๋Œ€์˜ ์ตœ์†Œ ํฌ๊ธฐ (= ๋‹ต)

    for i in range(n):
        row = list(map(int, input().split()))
        for j in range(m):
            origin_board[i][j] = row[j]
            if 1 <= origin_board[i][j] <= 5:
                cctv.append((i, j))
            if origin_board[i][j] == 0:
                min_size += 1

    # 4^(len(cctv)) ๋งŒํผ ๋ฐ˜๋ณต
    for k in range(4 ** (len(cctv))):
        # ์ผ๋‹จ ๋ณต์‚ฌ (์ดˆ๊ธฐํ™” ๊ณผ์ •)
        for i in range(n):
            for j in range(m):
                current_board[i][j] = origin_board[i][j]

        curr = k
        for i in range(len(cctv)):
            x, y = cctv[i]
            d = curr % 4  # 0, 1, 2, 3 ์ค‘ ํ•˜๋‚˜

            if origin_board[x][y] == 1:
                update_board(x, y, d)
            elif origin_board[x][y] == 2:
                update_board(x, y, d)
                update_board(x, y, d + 2)
            elif origin_board[x][y] == 3:
                update_board(x, y, d)
                update_board(x, y, d + 1)
            elif origin_board[x][y] == 4:
                update_board(x, y, d)
                update_board(x, y, d + 1)
                update_board(x, y, d + 2)
            else:
                update_board(x, y, d)
                update_board(x, y, d + 1)
                update_board(x, y, d + 2)
                update_board(x, y, d + 3)

            curr //= 4
        min_size = min(sum(current_board[i][j] == 0 for i in range(n) for j in range(m)), min_size)
    return min_size


print(solution())