๋ฌธ์
์์ด ์คํ๊ต์ ์ฝ๋ฉ ๋์๋ฆฌ์์ ๊ฒ์์ ๋ง๋ค์๋ค. ์ด ๊ฒ์์ ํฌ๊ธฐ๊ฐ N×N์ธ ๊ฒฉ์์์ ์งํ๋๊ณ , ์ด๊ธฐ์ ๊ฒฉ์์ ๋ชจ๋ ์นธ์๋ ๋ธ๋ก์ด ํ๋์ฉ ๋ค์ด์๊ณ , ๋ธ๋ก์ ๊ฒ์์ ๋ธ๋ก, ๋ฌด์ง๊ฐ ๋ธ๋ก, ์ผ๋ฐ ๋ธ๋ก์ด ์๋ค. ์ผ๋ฐ ๋ธ๋ก์ M๊ฐ์ง ์์์ด ์๊ณ , ์์ M์ดํ์ ์์ฐ์๋ก ํํํ๋ค. ๊ฒ์์ ๋ธ๋ก์ -1, ๋ฌด์ง๊ฐ ๋ธ๋ก์ 0์ผ๋ก ํํํ๋ค. (i, j)๋ ๊ฒฉ์์ i๋ฒ ํ, j๋ฒ ์ด์ ์๋ฏธํ๊ณ , |r1 - r2| + |c1 - c2| = 1์ ๋ง์กฑํ๋ ๋ ์นธ (r1, c1)๊ณผ (r2, c2)๋ฅผ ์ธ์ ํ ์นธ์ด๋ผ๊ณ ํ๋ค.
๋ธ๋ก ๊ทธ๋ฃน์ ์ฐ๊ฒฐ๋ ๋ธ๋ก์ ์งํฉ์ด๋ค. ๊ทธ๋ฃน์๋ ์ผ๋ฐ ๋ธ๋ก์ด ์ ์ด๋ ํ๋ ์์ด์ผ ํ๋ฉฐ, ์ผ๋ฐ ๋ธ๋ก์ ์์ ๋ชจ๋ ๊ฐ์์ผ ํ๋ค. ๊ฒ์์ ๋ธ๋ก์ ํฌํจ๋๋ฉด ์ ๋๊ณ , ๋ฌด์ง๊ฐ ๋ธ๋ก์ ์ผ๋ง๋ ๋ค์ด์๋ ์๊ด์๋ค. ๊ทธ๋ฃน์ ์ํ ๋ธ๋ก์ ๊ฐ์๋ 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์์ผ ํ๋ฉฐ, ์์์ ํ ๋ธ๋ก์์ ๊ทธ๋ฃน์ ์ํ ์ธ์ ํ ์นธ์ผ๋ก ์ด๋ํด์ ๊ทธ๋ฃน์ ์ํ ๋ค๋ฅธ ๋ชจ๋ ์นธ์ผ๋ก ์ด๋ํ ์ ์์ด์ผ ํ๋ค. ๋ธ๋ก ๊ทธ๋ฃน์ ๊ธฐ์ค ๋ธ๋ก์ ๋ฌด์ง๊ฐ ๋ธ๋ก์ด ์๋ ๋ธ๋ก ์ค์์ ํ์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ๋ธ๋ก, ๊ทธ๋ฌํ ๋ธ๋ก์ด ์ฌ๋ฌ๊ฐ๋ฉด ์ด์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ๋ธ๋ก์ด๋ค.
์ค๋์ ์ด ๊ฒ์์ ์คํ ํ๋ ์ด ๊ธฐ๋ฅ์ ๋ง๋๋ ค๊ณ ํ๋ค. ์คํ ํ๋ ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ๋ธ๋ก ๊ทธ๋ฃน์ด ์กด์ฌํ๋ ๋์ ๊ณ์ํด์ ๋ฐ๋ณต๋์ด์ผ ํ๋ค.
- ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ํฐ ๋ธ๋ก ๊ทธ๋ฃน์ ์ฐพ๋๋ค. ๊ทธ๋ฌํ ๋ธ๋ก ๊ทธ๋ฃน์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ํฌํจ๋ ๋ฌด์ง๊ฐ ๋ธ๋ก์ ์๊ฐ ๊ฐ์ฅ ๋ง์ ๋ธ๋ก ๊ทธ๋ฃน, ๊ทธ๋ฌํ ๋ธ๋ก๋ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด ๊ธฐ์ค ๋ธ๋ก์ ํ์ด ๊ฐ์ฅ ํฐ ๊ฒ์, ๊ทธ ๊ฒ๋ ์ฌ๋ฌ๊ฐ์ด๋ฉด ์ด์ด ๊ฐ์ฅ ํฐ ๊ฒ์ ์ฐพ๋๋ค.
- 1์์ ์ฐพ์ ๋ธ๋ก ๊ทธ๋ฃน์ ๋ชจ๋ ๋ธ๋ก์ ์ ๊ฑฐํ๋ค. ๋ธ๋ก ๊ทธ๋ฃน์ ํฌํจ๋ ๋ธ๋ก์ ์๋ฅผ B๋ผ๊ณ ํ์ ๋, B2์ ์ ํ๋ํ๋ค.
- ๊ฒฉ์์ ์ค๋ ฅ์ด ์์ฉํ๋ค.
- ๊ฒฉ์๊ฐ 90๋ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ค.
- ๋ค์ ๊ฒฉ์์ ์ค๋ ฅ์ด ์์ฉํ๋ค.
๊ฒฉ์์ ์ค๋ ฅ์ด ์์ฉํ๋ฉด ๊ฒ์์ ๋ธ๋ก์ ์ ์ธํ ๋ชจ๋ ๋ธ๋ก์ด ํ์ ๋ฒํธ๊ฐ ํฐ ์นธ์ผ๋ก ์ด๋ํ๋ค. ์ด๋์ ๋ค๋ฅธ ๋ธ๋ก์ด๋ ๊ฒฉ์์ ๊ฒฝ๊ณ๋ฅผ ๋ง๋๊ธฐ ์ ๊น์ง ๊ณ์ ๋๋ค.
๋ค์์ N = 5, M = 3์ธ ๊ฒฝ์ฐ์ ์์์ด๋ค.
2 | 2 | -1 | 3 | 1 |
3 | 3 | 2 | 0 | -1 |
0 | 0 | 0 | 1 | 2 |
-1 | 3 | 1 | 3 | 2 |
0 | 3 | 2 | 2 | 1 |
์ฌ๊ธฐ์ ์ฐพ์ ์ ์๋ ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ํฐ ๋ธ๋ก ๊ทธ๋ฃน์ ๋ค์๊ณผ ๊ฐ์ด ๋นจ๊ฐ์์ผ๋ก ํ์ํ๋ค.
2 | 2 | -1 | 3 | 1 |
3 | 3 | 2 | 0 | -1 |
0 | 0 | 0 | 1 | 2 |
-1 | 3 | 1 | 3 | 2 |
0 | 3 | 2 | 2 | 1 |
๋ธ๋ก ๊ทธ๋ฃน์ด ์ ๊ฑฐ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๊ณ , ์ ์ 82์ ์ ํ๋ํ๋ค.
2 | 2 | -1 | 3 | 1 |
2 | 0 | -1 | ||
1 | 2 | |||
-1 | 1 | 3 | 2 | |
2 | 2 | 1 |
์ค๋ ฅ์ด ์์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋ค.
-1 | 3 | 1 | ||
0 | -1 | |||
2 | 2 | 1 | 2 | |
-1 | 1 | 3 | 2 | |
2 | 2 | 2 | 1 |
90๋ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1 | -1 | 2 | 2 | 1 |
3 | 0 | 1 | 3 | 2 |
-1 | 2 | 1 | 2 | |
2 | ||||
2 | -1 |
๋ค์ ์ฌ๊ธฐ์ ์ค๋ ฅ์ด ์์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋ค.
1 | -1 | |||
3 | 2 | 2 | 1 | |
-1 | 1 | 3 | 2 | |
2 | 1 | 2 | ||
0 | 2 | -1 | 2 |
์คํ ํ๋ ์ด๊ฐ ๋ชจ๋ ๋๋ฌ์ ๋ ํ๋ํ ์ ์์ ํฉ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฒฉ์ ํ ๋ณ์ ํฌ๊ธฐ N, ์์์ ๊ฐ์ M์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฒฉ์์ ์นธ์ ๋ค์ด์๋ ๋ธ๋ก์ ์ ๋ณด๊ฐ 1๋ฒ ํ๋ถํฐ N๋ฒ ํ๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. ๊ฐ ํ์ ๋ํ ์ ๋ณด๋ 1์ด๋ถํฐ N์ด๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์นธ์ ์ ๋ณด๋ -1, 0, M์ดํ์ ์์ฐ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ๋ํ ์ ์์ ํฉ์ ์ถ๋ ฅํ๋ค.
https://www.acmicpc.net/problem/21609
21609๋ฒ: ์์ด ์คํ๊ต
์์ด ์คํ๊ต์ ์ฝ๋ฉ ๋์๋ฆฌ์์ ๊ฒ์์ ๋ง๋ค์๋ค. ์ด ๊ฒ์์ ํฌ๊ธฐ๊ฐ N×N์ธ ๊ฒฉ์์์ ์งํ๋๊ณ , ์ด๊ธฐ์ ๊ฒฉ์์ ๋ชจ๋ ์นธ์๋ ๋ธ๋ก์ด ํ๋์ฉ ๋ค์ด์๊ณ , ๋ธ๋ก์ ๊ฒ์์ ๋ธ๋ก, ๋ฌด์ง๊ฐ ๋ธ๋ก, ์ผ๋ฐ ๋ธ๋ก
www.acmicpc.net
๐ก ํ์ด ๋ฐ ์ฝ๋
from collections import deque
n, m = map(int, input().split())
board = []
for _ in range(n):
board.append(list(map(int, input().split())))
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
def dfs(x, y, value, visited, visited_now):
global count_block, count_rainbow
visited_now[x][y] = 1
if board[x][y] > 0:
visited[x][y] = 1
count_block += 1
count_rainbow += 1 if board[x][y] == 0 else 0
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if nx < 0 or nx >= n or ny < 0 or ny >= n or visited[nx][ny] or visited_now[nx][ny]:
continue
if board[nx][ny] == value or board[nx][ny] == 0:
dfs(nx, ny, value, visited, visited_now)
def findMaxBlockGroup():
global count_block, count_rainbow
max_block_group = (0, 0, 0, 0)
visited = [[0]*n for _ in range(n)]
for i in range(n):
for j in range(n):
if board[i][j] > 0 and not visited[i][j]:
visited_now = [[0]*n for _ in range(n)]
count_block, count_rainbow = 0, 0
dfs(i, j, board[i][j], visited, visited_now)
if count_block >= 2:
max_block_group = max(max_block_group, (count_block, count_rainbow, i, j))
return max_block_group
def removeBlockGroup(x, y):
queue = deque()
visited = [[0]*n for _ in range(n)]
queue.append((x, y))
value = board[x][y]
board[x][y] = -2
while queue:
x, y = queue.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if nx < 0 or nx >= n or ny < 0 or ny >= n or visited[nx][ny]:
continue
if board[nx][ny] == value or board[nx][ny] == 0:
queue.append((nx, ny))
board[nx][ny] = -2
def gravity():
for j in range(n):
remained = []
for i in range(n-1, -1, -1):
if board[i][j] == -1:
remained = remained + [-2] * (n - i - len(remained) - 1)
if board[i][j] != -2:
remained.append(board[i][j])
remained = remained + [-2] * (n - len(remained))
for i in range(n-1, -1, -1):
board[i][j] = remained[n-i-1]
def rotateCounterclockwise():
return list(map(list, zip(*board)))[::-1]
result = 0
while 1:
block_size, _, standard_x, standard_y = findMaxBlockGroup()
if block_size == 0:
break
removeBlockGroup(standard_x, standard_y)
result += block_size**2
gravity()
board = rotateCounterclockwise()
gravity()
print(result)
์๊ตฌ์ฌํญ์ด ๋ง๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฅผ ์ ์ฝ๊ณ ์กฐ๊ฑด์ ํ์ ํ ํ ๊ทธ๋๋ก ๊ตฌํํ๋ฉด ๋๋ค. ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฅํ์๋ค.
- findMaxBlockGroup(): dfs๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ฅ ํฐ ๋ธ๋ก ๊ทธ๋ฃน ์ฐพ๊ธฐ
- removeBlockGroup(): ํด๋น ๊ทธ๋ฃน์ ๋ชจ๋ ์์ ์ญ์ ํ๊ธฐ -> ์ดํ ์ ์ ๊ณ์ฐ
- gravity(): ์ค๋ ฅ ๊ฐํ๊ธฐ
- rotateCounterclockwise(): ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ๊ฒฉ์ ๋๋ฆฌ๊ธฐ
'Algorithm > ๐ Baekjoon Judge' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ๋ฐฑ์ค 21608๋ฒ ์์ด ์ด๋ฑํ๊ต - ํ์ด์ฌ(Python) (0) | 2022.10.07 |
---|---|
[BOJ] ๋ฐฑ์ค 17144๋ฒ ๋ฏธ์ธ๋จผ์ง ์๋ ! - ํ์ด์ฌ(Python) (0) | 2022.08.26 |
[BOJ] ๋ฐฑ์ค 15685๋ฒ ๋๋๊ณค ์ปค๋ธ - ํ์ด์ฌ(Python) (0) | 2022.08.23 |
[BOJ] ๋ฐฑ์ค 2133๋ฒ ํ์ผ ์ฑ์ฐ๊ธฐ - ํ์ด์ฌ(Python) (0) | 2022.08.18 |
[BOJ] ๋ฐฑ์ค 2294๋ฒ ๋์ 2 - ํ์ด์ฌ(Python) (0) | 2022.08.18 |