https://school.programmers.co.kr/learn/courses/30/lessons/84021
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
์ ์ฒด ๋ก์ง
1. table -> ์ด์ด์ง ํผ์ฆ ์กฐ๊ฐ ๋ถ๋ถ๋ง ์๋ผ์ ํ๋ ฌ๋ก ๋ง๋ค์ด์ฃผ๊ณ board์ ์ถ๊ฐ
2. game_board -> ์ด์ด์ง ๋น ๋ถ๋ถ๋ง ์๋ผ์ ํ๋ ฌ๋ก ๋ง๋ค์ด์ฃผ๊ณ rotateํ๋ฉด์ ๊ฐ ์ํ๋ฌธ๋ง๋ค board์ ๊ฐ์ ๊ฐ์ด ์๋์ง ์ฐพ๊ณ ์ ๋ต ์ถ๊ฐ
bfs(x, y, t, f, array, size)
- ํ์ [x, y]๋ฅผ ๋ฃ๊ณ ์ด์ด์ง ๋ถ๋ถ์ ์ฐพ๋๋ค.
- table์ 1์ ์ฐพ์์ผ ํ๊ณ , game_board๋ 0์ ์ฐพ์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ณ์ t๋ฅผ ๋๋ค.
- ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ธ๋ฑ์ค๋ f๊ฐ(table: 0, game_board: 1)์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
- ์ด์ด์ง ๋ถ๋ถ์ ์ธ๋ฑ์ค๋ค์ ์ ์ฅํ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
make_board(array)
- ์ด์ด์ง ๋ถ๋ถ์ ์ธ๋ฑ์ค๋ค์ ์ต๋๊ฐ, ์ต์๊ฐ์ ์ฐพ์ ํ, ์ด์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ค.
- ํx์ด์ ํฌ๊ธฐ์ ๋ฐฐ์ด์ ์ ์ธํ๊ณ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
- ์ ๋ ฅ๋ฐ์ ๋ฐฐ์ด์ ์ํํ๋ฉด์ ํด๋น ๋ถ๋ถ๋ง 1๋ก ๋ฐ๊ฟ์ค๋ค.
- ์๋ก ๋ง๋ค์ด์ง ๋ถ๋ถ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
rotate(array)
- ์ ๋ ฅ๋ฐ์ ๋ฐฐ์ด์ 90๋ ํ์ ํ ํ ๋ฐํํ๋ค.
# ํ๋ก๊ทธ๋๋จธ์ค 84021: ํผ์ฆ ์กฐ๊ฐ ์ฑ์ฐ๊ธฐ
from collections import deque
def bfs(x, y, t, f, array, size):
move = [[1, 0], [-1, 0], [0, 1], [0, -1]]
temp = []
queue = deque()
queue.append([x, y])
while queue:
x, y = queue.popleft()
array[x][y] = f
temp.append([x, y])
for dx, dy in move:
mx = x + dx
my = y + dy
if mx < 0 or mx >= size or my < 0 or my >= size:
continue
if array[mx][my] == t:
queue.append([mx, my])
return temp
def make_board(array):
x1 = min(array, key=lambda x:x[0])[0]
x2 = max(array, key=lambda x:x[0])[0]
y1 = min(array, key=lambda x:x[1])[1]
y2 = max(array, key=lambda x:x[1])[1]
sizeX = x2 - x1 + 1
sizeY = y2 - y1 + 1
temp = [[0] * sizeY for _ in range(sizeX)]
for x, y in array:
temp[x-x1][y-y1] = 1
return temp
def rotate(array):
r = [list(i) for i in zip(*array[::-1])]
return r
def solution(game_board, table):
size = len(game_board)
board = [] # ํผ์ฆ ์กฐ๊ฐ๋ค์ ์ ์ฅํ ๋ฆฌ์คํธ
for i in range(size):
for j in range(size):
if table[i][j] == 1:
# table์์ ์ด์ด์ง ํผ์ฆ ์กฐ๊ฐ์ ์ฐพ๊ณ ,
temp = bfs(i, j, 1, 0, table, size)
# ๊ทธ ๋ถ๋ถ๋ง ๋ผ์ ์ ์ฅ
board.append(make_board(temp))
visited = [False] * len(board) # table์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ ๋ฆฌ์คํธ
answer = 0
check = 0 # break๋ฌธ์ ์ํ ๋ณ์
for i in range(size):
for j in range(size):
if game_board[i][j] == 0:
# game_board์์ ์ด์ด์ง ๋น ๋ถ๋ถ์ ์ฐพ๊ณ ,
temp = bfs(i, j, 0, 1, game_board, size)
# ๊ทธ ๋ถ๋ถ๋ง ๋ผ์ ๋น๊ต
temp = make_board(temp)
for k in range(4):
# ํ์
temp = rotate(temp)
# board๋ฅผ ์ํํ๋ฉด์
for b in range(len(board)):
if visited[b]:
continue
# ๋น ๋ถ๋ถ๊ณผ board๊ฐ ๊ฐ์ผ๋ฉด ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํ ์ ๋ต ์ถ๊ฐ
if temp == board[b]:
visited[b] = True
for t in temp:
answer += t.count(1)
check = 1
break
if check == 1:
check = 0
break
return answer
์ฐธ,,,, ์ง์ ๋ถํ๋ค,,,