1์ฐจ์ ๋ฐฐ์ด์ด 2์ฐจ์์ด ๋๋ค๊ฐ ๋ค์ 1์ฐจ์์ด ๋๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ ๋ฐฐ์ด์ ๋๋ฆฌ๋ ์๋ฎฌ๋ ์ด์ ๋ฌธ์ . ์ ๋ต๋ฅ ์ด ๋์ ๊ฑธ ๋ณด๋ฉด ๋ฌธ์ ๋ง ์ ์ฝ์ผ๋ฉด ํ๋ฆด ์ผ ์์ ๊ฑฐ ๊ฐ์๋ค.
- ๋ฌผ๊ณ ๊ธฐ ์๊ฐ ๊ฐ์ฅ ์ ์ ์นธ๋ค์ 1์ฉ ์ถ๊ฐํ๋ค
- ๋ถ๊ฐ๋ฅํ ๋๊น์ง ์ดํญ์ ์๋๋ค
- ๋ฌผ๊ณ ๊ธฐ์ ์๋ฅผ ์กฐ์ ํ๋ค
- ํ ์ค๋ก ๋ง๋ ๋ค
- ๋ฐ์ผ๋ก ์๋ผ์ 180๋ ํ์ ํ๋ค. ๋ ๋ฒ ๋ฐ๋ณตํ๋ค.
- ๋ฌผ๊ณ ๊ธฐ ์๋ฅผ ์กฐ์ ํ๋ค.
- ๋ค์ ํ ์ค๋ก ๋ง๋ ๋ค
๊ฐ์ฅ ์ผ์ชฝ์ ํ ์นธ์ ์์์ผ๋ก ์ดํญ์ ์์์ ์ฌ๋ฆฌ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ดํญ์ด ์์ฌ์๋ ๋ถ๋ถ๋ค๋ง ๋ชจ์์ 90๋๋ฅผ ํ์ ํ๋ค. ๊ทธ๋ฆผ์์๋ ์๋ก ์์ด๋ ๊ฑธ๋ก ํํ๋์ง๋ง ์ฝ๋ ์์์๋ ์ข ๋ ํธํ๊ฒ ๊ตฌํํ ์ ์๋๋ก ์๋๋ก ์์๋ค.
[
[9, 3, 11, 8]
[14, 5]
[3, 3]
]
๊ธฐ๋ณธ์ ์ผ๋ก ์์ธ ์ดํญ์ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ํ๋๋ค. [[9, 3], [14, 5], [3, 3]] ์ 3ํ 2์ด ๋ฐฐ์ด๋ง ๋ผ์ด๋ด์ 90๋ ํ์ ์์ผ์ผ ํ๋ค. ๊ท์น์ ์๊ฐํด๋ณด๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง ํ์ ์ด ๊ธธ์ด๋งํผ๋ง ๋ชจ๋ ํ์ ๋ํด์ ๋ผ์ด๋ด๋ฉด ๋๋ค๋ ๊ฑธ ์ ์ ์๋ค. ๊ทธ๋ ๊ฒ ๋ง๋ค์ด์ง 2์ฐจ์ ๋ฐฐ์ด์ 90๋ ํ์ ํ์ฌ ๋ค์ ๋จ์ ๋ฐฐ์ด์ ์๋์ ์ถ๊ฐํ๋ค.
# ๋ฐฐ์ด ๋ผ์ด๋ด๊ธฐ
def detach(arr, r, k):
tmp = []
for i in range(r-1):
tmp.append(arr.pop())
tmp.append(arr[0][:k])
arr[0] = arr[0][k:]
return tmp, arr
# ์ฒซ ๋ฒ์งธ ์ดํญ ์๊ธฐ(90๋ ํ์ )
def stack(arr):
arr.append([arr[0].pop(0)])
while True:
r, c, k = len(arr), len(arr[0]), len(arr[-1])
if c-k<r:
break
tmp, arr = detach(arr, r, k)
arr.extend(rotate(tmp))
return arr
๋ชจ๋ ์นธ์ ๋ํด์ ์ํ์ข์ฐ๋ฅผ ๋ค ๋น๊ตํด์ผ ํ๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ๋น๊ตํ๋ค๋ณด๋ฉด ๊ฒน์น๋ ์นธ์ ๋ํด์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ๋ฏ๋ก, ์ฝ๊ฒ ๋น๊ตํ๊ธฐ ์ํด์ ๋ชจ๋ ์นธ์ ๋ํด์ ์ค๋ฅธ์ชฝ๊ณผ ์๋์ชฝ์ ๋ํด์๋ง ๋น๊ต๋ฅผ ์ํํ๋ค. ์ด์ฐจํผ ๋ ์ค 2๊ฐ์ ์นธ์ ๋ํด์ ๋ชจ๋ ๋น๊ตํ ํ์ ์์ด ๋ ์ค ํ๋์ ์นธ์ ๋ํด์๋ง ๋น๊ตํ๋ฉด ๋๊ธฐ ๋๋ฌธ. ๋น๊ต๋ฅผ ํ๋ ๋์ค์ ์ซ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ์ฆ๊ฐํ๊ฑฐ๋ ๊ฐ์ํ๋ ๊ฐ๋ค์ ๋ํด์๋ ์์ ๋ฐฐ์ด์ ์ ์ฅํด์ผ ํ๋ค.
def fish_control(arr):
n = len(arr)
tmp = [[0]*len(arr[i]) for i in range(n)]
for i in range(n):
m = len(arr[i])
for j in range(m):
for ni, nj in (i-1, j), (i, j+1):
if not(-1<ni<n and -1<nj<m):
continue
mod = abs(arr[i][j] - arr[ni][nj])//5
if mod < 0:
continue
if arr[i][j] > arr[ni][nj]:
tmp[ni][nj] += mod
tmp[i][j] -= mod
else:
tmp[i][j] += mod
tmp[ni][nj] -= mod
for i in range(n):
for j in range(len(arr[i])):
arr[i][j] += tmp[i][j]
return arr
์ ๋ฐ๋งํผ ์๋ผ์ 180๋ ์๋ก ์๋ ์์ ์ 2๋ฒ๋ง ๋ฐ๋ณตํ๋ฉด ๋๋ค.
def levitation(arr):
for i in range(2):
tmp = []
k = len(arr[0])//2
for j in range(len(arr)-1, -1, -1):
tmp.append(arr[j][:k][::-1])
arr[j] = arr[j][k:]
arr.extend(tmp)
return arr
๋ฐฐ์ด์ ๋ผ์ด๋ด์ ๋ค์ ์ผ๋ ฌ๋ก ๋ง๋ ๋ค.
def make_row(arr):
tmp, lst = detach(arr, len(arr), len(arr[-1]))
arr = []
for row in rotate(tmp)[::-1]:
arr.extend(row)
arr.extend(*lst)
return [arr]
# ์ดํญ ์ ๋ฆฌ : 44ms (Python3)
# ํ์
def rotate(arr):
return list(map(list, zip(*arr[::-1])))[::-1]
# ๊ฐ์ฅ ์์ ๋ฌผ๊ณ ๊ธฐ์ ์ดํญ์ 1์ถ๊ฐ
def minimum_fish(arr):
min_v = min(arr[0])
for i in range(len(arr[0])):
if arr[0][i] == min_v:
arr[0][i] += 1
return arr
# ์ดํญ ๋ผ์ด๋ด์ ๋๋ฆฌ๊ธฐ
def detach(arr, r, k):
tmp = []
for i in range(r-1):
tmp.append(arr.pop())
tmp.append(arr[0][:k])
arr[0] = arr[0][k:]
return tmp, arr
# ์ฒซ ๋ฒ์งธ ์ดํญ ์๊ธฐ
def stack(arr):
arr.append([arr[0].pop(0)])
while True:
r, c, k = len(arr), len(arr[0]), len(arr[-1])
if c-k<r:
break
tmp, arr = detach(arr, r, k)
arr.extend(rotate(tmp))
return arr
# ๋ฌผ๊ณ ๊ธฐ ์ ์กฐ์
def fish_control(arr):
n = len(arr)
tmp = [[0]*len(arr[i]) for i in range(n)]
for i in range(n):
m = len(arr[i])
for j in range(m):
for ni, nj in (i-1, j), (i, j+1):
if not(-1<ni<n and -1<nj<m):
continue
mod = abs(arr[i][j] - arr[ni][nj])//5
if mod < 0:
continue
if arr[i][j] > arr[ni][nj]:
tmp[ni][nj] += mod
tmp[i][j] -= mod
else:
tmp[i][j] += mod
tmp[ni][nj] -= mod
for i in range(n):
for j in range(len(arr[i])):
arr[i][j] += tmp[i][j]
return arr
# ์ผ๋ ฌ๋ก ๋ง๋ค๊ธฐ
def make_row(arr):
tmp, lst = detach(arr, len(arr), len(arr[-1]))
arr = []
for row in rotate(tmp)[::-1]:
arr.extend(row)
arr.extend(*lst)
return [arr]
# ๊ณต์ค ๋ถ์
def levitation(arr):
for i in range(2):
tmp = []
k = len(arr[0])//2
for j in range(len(arr)-1, -1, -1):
tmp.append(arr[j][:k][::-1])
arr[j] = arr[j][k:]
arr.extend(tmp)
return arr
n, k = map(int, input().split())
arr = [list(map(int, input().split()))]
count = 0
while True:
if max(arr[0]) - min(arr[0]) <= k:
print(count)
break
arr = make_row(fish_control(levitation(make_row(fish_control(stack(minimum_fish(arr)))))))
count += 1