π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[BAEKJOON python] 21609_μμ΄ μ€νκ΅ λ³Έλ¬Έ
728x90
λ°μν
μμ΄ μ€νκ΅
μμ΄ μ€νκ΅μ μ½λ© λμ리μμ κ²μμ λ§λ€μλ€
μ΄ κ²μμ ν¬κΈ°κ° N×NμΈ κ²©μμμ μ§νλκ³ , μ΄κΈ°μ 격μμ λͺ¨λ μΉΈμλ λΈλ‘μ΄ νλμ© λ€μ΄μμ
λΈλ‘μ κ²μμ λΈλ‘, 무μ§κ° λΈλ‘, μΌλ° λΈλ‘
μΌλ° λΈλ‘μ Mκ°μ§ μμμ΄ μκ³ , μμ Mμ΄νμ μμ°μλ‘ νν
κ²μμ λΈλ‘μ -1
무μ§κ° λΈλ‘μ 0μΌλ‘ νν
(i, j)λ 격μμ iλ² ν, jλ² μ΄μ μλ―Έ
|r1 - r2| + |c1 - c2| = 1μ λ§μ‘±νλ λ μΉΈ (r1, c1)κ³Ό (r2, c2)λ₯Ό μΈμ ν μΉΈ
λΈλ‘ κ·Έλ£Ήμ μ°κ²°λ λΈλ‘μ μ§ν©
μΌλ° λΈλ‘μ΄ μ μ΄λ νλ μμ΄μΌ νλ©°, μΌλ° λΈλ‘μ μμ λͺ¨λ κ°μμΌ νλ€
κ²μμ λΈλ‘μ ν¬ν¨λλ©΄ μ λκ³ , 무μ§κ° λΈλ‘μ μΌλ§λ λ€μ΄μλ μκ΄μλ€
κ·Έλ£Ήμ μν λΈλ‘μ κ°μλ 2λ³΄λ€ ν¬κ±°λ κ°μμΌ νλ©°, μμμ ν λΈλ‘μμ κ·Έλ£Ήμ μν μΈμ ν μΉΈμΌλ‘ μ΄λν΄μ κ·Έλ£Ήμ μν λ€λ₯Έ λͺ¨λ μΉΈμΌλ‘ μ΄λν μ μμ΄μΌ νλ€
λΈλ‘ κ·Έλ£Ήμ κΈ°μ€ λΈλ‘μ 무μ§κ° λΈλ‘μ΄ μλ λΈλ‘ μ€μμ νμ λ²νΈκ° κ°μ₯ μμ λΈλ‘, κ·Έλ¬ν λΈλ‘μ΄ μ¬λ¬κ°λ©΄ μ΄μ λ²νΈκ° κ°μ₯ μμ λΈλ‘
μ€λμ μ΄ κ²μμ μ€ν νλ μ΄ κΈ°λ₯μ λ§λλ €κ³ νλ€
μ€ν νλ μ΄λ λ€μκ³Ό κ°μ κ³Όμ μ΄ λΈλ‘ κ·Έλ£Ήμ΄ μ‘΄μ¬νλ λμ κ³μν΄μ λ°λ³΅
1) ν¬κΈ°κ° κ°μ₯ ν° λΈλ‘ κ·Έλ£Ήμ μ°Ύλλ€
λΈλ‘ κ·Έλ£Ήμ΄ μ¬λ¬ κ°λΌλ©΄ ν¬ν¨λ 무μ§κ° λΈλ‘μ μκ° κ°μ₯ λ§μ λΈλ‘ κ·Έλ£Ή
κ·Έλ¬ν λΈλ‘λ μ¬λ¬κ°λΌλ©΄ κΈ°μ€ λΈλ‘μ νμ΄ κ°μ₯ ν° κ²μ
κ·Έ κ²λ μ¬λ¬κ°μ΄λ©΄ μ΄μ΄ κ°μ₯ ν° κ²μ μ°Ύλλ€
2) 1) μμ μ°Ύμ λΈλ‘ κ·Έλ£Ήμ λͺ¨λ λΈλ‘μ μ κ±°νλ€
λΈλ‘ κ·Έλ£Ήμ ν¬ν¨λ λΈλ‘μ μλ₯Ό BλΌκ³ νμ λ, B^2μ μ νλ
3) 격μμ μ€λ ₯μ΄ μμ©νλ€
4) 격μκ° 90λ λ°μκ³ λ°©ν₯μΌλ‘ νμ
5) λ€μ 격μμ μ€λ ₯μ΄ μμ©
격μμ μ€λ ₯μ΄ μμ©νλ©΄ κ²μμ λΈλ‘μ μ μΈν λͺ¨λ λΈλ‘μ΄ νμ λ²νΈκ° ν° μΉΈμΌλ‘ μ΄λ
μ΄λμ λ€λ₯Έ λΈλ‘μ΄λ 격μμ κ²½κ³λ₯Ό λ§λκΈ° μ κΉμ§ κ³μ λλ€
μ€ν νλ μ΄κ° λͺ¨λ λλ¬μ λ νλν μ μμ ν©μ ꡬν΄λ³΄μ
첫째 μ€μ 격μ ν λ³μ ν¬κΈ° N, μμμ κ°μ M
λμ§Έ μ€λΆν° Nκ°μ μ€μ 격μμ μΉΈμ λ€μ΄μλ λΈλ‘μ μ λ³΄κ° 1λ² νλΆν° Nλ² ν
κ° νμ λν μ 보λ 1μ΄λΆν° Nμ΄κΉμ§
μΉΈμ μ 보λ -1, 0, Mμ΄ν
from collections import deque
# 격μ ν λ³μ ν¬κΈ° N, μμμ κ°μ M
n, m = map(int, input().split())
# 격μμ μΉΈμ λ€μ΄μλ λΈλ‘μ μ 보 (κ²μμ λΈλ‘, 무μ§κ° λΈλ‘, μΌλ° λΈλ‘μ Mκ°μ§ μμ)
board = [list(map(int, input().split())) for _ in range(n)]
# λ°μκ³ λ°©ν₯
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
def bfs(x, y, visited, b_num):
queue = deque()
queue.append((x, y))
# λΈλ‘ μ 보
c = board[x][y]
# μΌλ° λΈλ‘μ Mκ°μ§ μμ, κ²μμ λΈλ‘μ -1, 무μ§κ° λΈλ‘μ 0
# λ°©λ¬Έμ²λ¦¬ + λΈλ‘ κ·Έλ£Ή λ²νΈ μ μ₯
visited[x][y] = b_num
size, r_n = 1, 0
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < n:
if board[nx][ny] == c and visited[nx][ny] == 0:
size += 1
visited[nx][ny] = b_num
queue.append((nx, ny))
elif board[nx][ny] == 0 and not b_num in visited[nx][ny]:
size += 1
r_n += 1
visited[nx][ny].append(b_num)
queue.append((nx, ny))
# λΈλ‘ κ·Έλ£Ήμ μ¬μ΄μ¦μ, λΈλ‘ κ·Έλ£Ή μμ μλ 무μ§κ° λΈλ‘μ κ°―μ
return size, r_n
# μ€λ ₯
def fall(x, y) :
stop = False
for i in range(x + 1, n) :
nx = i
if board[nx][y] != -2 :
stop = True
break
if stop :
board[nx-1][y] = board[x][y]
else :
board[nx][y] = board[x][y]
# λΈλ‘μ μ κ±°νλ€. μ κ±° μ -2κ°μΌλ‘ λ³κ²½νλ€.
board[x][y] = -2
score = 0
while True:
visited = [[0]*n for _ in range(n)]
for i in range(n):
for j in range(n):
if board[i][j] == 0:
visited[i][j] = []
b_num, block = 1, []
for i in range(n):
for j in range(n):
if board[i][j] > 0 and visited[i][j] == 0:
# # λΈλ‘ κ·Έλ£Ήμ μ¬μ΄μ¦μ, λΈλ‘ κ·Έλ£Ή μμ μλ 무μ§κ° λΈλ‘μ κ°―μ
size, r_n = bfs(i, j, visited, b_num)
if size > 1:
# κ·Έλ£Ήμ ν¬κΈ°, 무μ§κ°λΈλ‘μ κ°―μ, λΈλ‘ κΈ°μ€ ν, μ΄, λΈλ‘ λ²νΈ
block.append([size, r_n, i, j, b_num])
b_num += 1
if len(block) == 0:
break
# λΈλ‘ κ·Έλ£Ήμ ν¬κΈ° -> 무μ§κ° λΈλ‘μ κ°―μ -> λΈλ‘ κΈ°μ€μ ν -> μ΄
block.sort(key=lambda x:(-x[0], -x[1], -x[2], -x[3]))
count = 0
for i in range(n):
for j in range(n):
if board[i][j] > 0 and visited[i][j] == block[0][4]:
count += 1
board[i][j] = -2
elif board[i][j] == 0 and block[0][4] in visited[i][j]:
count += 1
board[i][j] = -2
score += (count*count)
for i in range(n-2, -1, -1):
for j in range(n):
# λΈλ‘μ μ κ±°νλ€. μ κ±° μ -2κ°μΌλ‘ λ³κ²½νλ€.
if board[i][j] >= 0 and board[i+1][j] == -2:
fall(i, j)
board = list(map(list, zip(*board)))[::-1]
for i in range(n-2, -1, -1):
for j in range(n):
# λΈλ‘μ μ κ±°νλ€. μ κ±° μ -2κ°μΌλ‘ λ³κ²½νλ€.
if board[i][j] >= 0 and board[i+1][j] == -2:
fall(i, j)
print(score)
μμ μ λ ₯
5 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
μμ μΆλ ₯
77
μ΄λ²κ».. μ«.. μ½λ ν΄μμ΄ μ΄λ €μ λ€.
λ€μ λμ ν κ²μ.
728x90
λ°μν
'π¦₯ μ½ν > BAEKJOON' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BAEKJOON python] 17822_μν λ리기 (0) | 2023.04.09 |
---|---|
[BAEKJOON python] 13460_ꡬμ¬νμΆ (1) | 2023.04.09 |
[BAEKJOON python] 21608_μμ΄ μ΄λ±νκ΅ (0) | 2023.04.08 |
[BAEKJOON python] 19237_μ΄λ₯Έ μμ΄ (0) | 2023.04.08 |
[BAEKJOON python] 19236_μ²μλ μμ΄ (0) | 2023.04.08 |
Comments