<๋ฌธ์ ๋งํฌ>
https://school.programmers.co.kr/learn/courses/30/lessons/84021
<ํ์ด ์ ๋ต>
1. ํ์ด ์ ๋ต์ ํฌ๊ฒ 1. ๋ธ๋ญ ๋ชจ์๊ณผ ๋น๊ณต๊ฐ์ ์ถ์ถํด์ + 2. ๋์ ๋น๊ตํ๋ค ๋ ๊ณผ์ ์ด๋ค.
2. ๋ธ๋ญ ๋ชจ์๊ณผ ๋น๊ณต๊ฐ ์ถ์ถ์ bfs๋ก ์ถ์ถํด์ ๋ชจ์์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๋ค.
3. ๋ ๊ฐ์ ๋น๊ต๊ฐ ์ด๋ ค์ด๋ฐ ๋๊ฐ์ ๊ฒฝ์ฐ๋ ๋ ๊ฐ์ 1:1 ๋งค์นญ์ ์ํด ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ฅ ์์ ์ขํ๋ฅผ ๋บด์ค์ผ๋ก์ (0, 0)๊ธฐ์ค์ผ๋ก ์ฌ๋น์นํ๊ณ , ์๊ณ๋ฐฉํฅ์ผ๋ก 90, 180, 270๋ ํ์ ํด๊ฐ๋ฉด์ ์ต์๊ฐ๋ง์ ์ ์ฅํด ๋ชจ์๋ค์ normalize ์์ผ์คฌ๋ค.
4. ๋ง์ง๋ง์ผ๋ก ์ค๋ณต ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ฉด์ normalizeํ ๋ชจ์๋ค์ ๋น๊ตํด๊ฐ๋ฉด์ ์ธ์ฃผ์๋ค
5. ํ๋ก๊ทธ๋๋จธ์ค ๊ณ ๋์ kit ๋ฌธ์ ์ค์ ๊ฐ์ฅ ๊ผผ๊ผผํ ๊ตฌํ์ด ์๊ตฌ๋์๋ ๋ฌธ์ . ์ด๋ฐ ๋ฌธ์ ๋ค์ ์ฃผ์ ์ฝ๋ ๋ธ๋ญ์ ํจ์ ๋ฑ์ ํตํด ๋ชจ๋ํ ํ๊ณ ์ค๊ฐ์ค๊ฐ ์ฃผ์์ ๋ฌ๋ฉด์ ํธ๋ ๊ฒ์ด ๋์์ด ๋๋ค.
<์ ๋ต ์ฝ๋>
# 210122 ํผ์ฆ์กฐ๊ฐ์ฑ์ฐ๊ธฐ
from collections import deque
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
def bfs(board, r, c, visited, target, N):
'''
board: ๋ฐฐ์ด ์ข
๋ฅ (๊ฒ์ / ํ
์ด๋ธ)
r, c: ์ขํ
visited: ํด๋น ๋ฐฐ์ด์ ๋ฐฉ๋ฌธ ํ์ ๋ฐฐ์ด
target: ํด๋น ๋ฐฐ์ด์์ ์ฐพ๊ณ ์ ํ๋ ์ซ์
N: ๋ฐฐ์ด ํฌ๊ธฐ
'''
# result: ๋ธ๋ญ ์ขํ ๋ด์ ๋ฐฐ์ด
result = [(r, c)]
visited[r][c] = 1
queue = deque()
queue.append((r, c))
# bfs ํ์์ผ๋ก ๋ธ๋ญ ์ขํ๋ค ์ฐพ์์ ๋ฐํ
while queue:
r, c = queue.popleft()
for i in range(4):
nr = r + dr[i]
nc = c + dc[i]
if 0 <= nr < N and 0 <= nc < N:
if not visited[nr][nc] and board[nr][nc] == target:
queue.append((nr, nc))
visited[nr][nc] = 1
result.append((nr, nc))
return result
# ๋ธ๋ญ ์ ๋ ฌ ํ ์ฌ๋ฐฐ์น
def sort_block(block: list):
# ์ ๋ ฌ
block.sort()
min_r = min([b[0] for b in block])
min_c = min([b[1] for b in block])
# ๋ธ๋ญ ๊ฐ ๋น๊ต ์ํด ๊ฐ์ฅ ์์ ์ขํ ๊ธฐ์ค์ผ๋ก ์ฌ๋ฐฐ์น
block = list(map(lambda x: (x[0] - min_r, x[1] - min_c), block))
return block
# ๋ธ๋ญ ํ์
def rotate_block(block: list, N):
# ํ ์กฐ๊ฐ ๋ธ๋ญ์ ๊ทธ๋๋ก ๋ฐํ
if len(block) == 1:
return block
# blocks: ํ์ ๋ ๋ธ๋ญ๋ค์ ๋ด์ ๋ฐฐ์ด
blocks = [block]
# 90, 180, 270๋ ํ์ +์ ๋ ฌ
for i in range(3):
block = list(map(lambda x: (x[1], N - 1 - x[0]), block))
block = sort_block(block)
blocks.append(block)
# ๋ธ๋ญ ๊ฐ ๋น๊ต ์ํด ๊ฐ์ฅ ์์ ์ขํ์ ๋ธ๋ญ ํ ๊ฐ๋ง ๋ฐํ
return min(blocks)
def solution(game_board, table):
# ๋ณ์ ์ค์ ๋ฐ ์ด๊ธฐํ
answer = 0
N = len(game_board)
# ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์ ๋ฐฐ์ด
visited_board = [[0 for _ in range(N)] for _ in range(N)]
visited_table = [[0 for _ in range(N)] for _ in range(N)]
# ๋ธ๋ญ ๋ด์ ๋ฐฐ์ด
block_board = []
block_table = []
for r in range(N):
for c in range(N):
# board
if not visited_board[r][c] and game_board[r][c] == 0:
block = bfs(game_board, r, c, visited_board, 0, N) # ๋ธ๋ญ ํ์
block = sort_block(block) # ์ ๋ ฌ ํ ์ฌ๋ฐฐ์น
block = rotate_block(block, N) # ํ์
block_board.append(block)
# table
if not visited_table[r][c] and table[r][c] == 1:
block = bfs(table, r, c, visited_table, 1, N)
block = sort_block(block)
block = rotate_block(block, N)
block_table.append(sort_block(block))
# ํผ์ฆ ์กฐ๊ฐ ์ฑ์ธ ๋ ์ค๋ณต ์ฌ๋ถ ๊ฒ์ฌ์ฉ ๋ฐฐ์ด
checked_board = [0 for _ in range(len(block_board))]
for block in block_table:
for i in range(len(block_board)):
# ์ด๋ฏธ ์ฑ์ ์ ๊ฒฝ์ฐ
if checked_board[i]:
continue
# ์ฑ์ธ ์ ์๋ ๊ฒฝ์ฐ
if block == block_board[i]:
checked_board[i] = 1
answer += len(block)
break
return answer
๋๊ธ