[BOJ] 23291. ์–ดํ•ญ ์ •๋ฆฌ (๐Ÿ’Ž, ๊ตฌํ˜„/์‹œ๋ฎฌ๋ ˆ์ด์…˜)

lemythe423ยท2023๋…„ 9์›” 18์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
53/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

1์ฐจ์› ๋ฐฐ์—ด์ด 2์ฐจ์›์ด ๋๋‹ค๊ฐ€ ๋‹ค์‹œ 1์ฐจ์›์ด ๋˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋ฐฐ์—ด์„ ๋Œ๋ฆฌ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ. ์ •๋‹ต๋ฅ ์ด ๋†’์€ ๊ฑธ ๋ณด๋ฉด ๋ฌธ์ œ๋งŒ ์ž˜ ์ฝ์œผ๋ฉด ํ‹€๋ฆด ์ผ ์—†์„ ๊ฑฐ ๊ฐ™์•˜๋‹ค.

  1. ๋ฌผ๊ณ ๊ธฐ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ์€ ์นธ๋“ค์— 1์”ฉ ์ถ”๊ฐ€ํ•œ๋‹ค
  2. ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ๊นŒ์ง€ ์–ดํ•ญ์„ ์Œ“๋Š”๋‹ค
  3. ๋ฌผ๊ณ ๊ธฐ์˜ ์ˆ˜๋ฅผ ์กฐ์ ˆํ•œ๋‹ค
  4. ํ•œ ์ค„๋กœ ๋งŒ๋“ ๋‹ค
  5. ๋ฐ˜์œผ๋กœ ์ž๋ผ์„œ 180๋„ ํšŒ์ „ํ•œ๋‹ค. ๋‘ ๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.
  6. ๋ฌผ๊ณ ๊ธฐ ์ˆ˜๋ฅผ ์กฐ์ ˆํ•œ๋‹ค.
  7. ๋‹ค์‹œ ํ•œ ์ค„๋กœ ๋งŒ๋“ ๋‹ค

์–ดํ•ญ ์Œ“๊ธฐ

๊ฐ€์žฅ ์™ผ์ชฝ์˜ ํ•œ ์นธ์„ ์‹œ์ž‘์œผ๋กœ ์–ดํ•ญ์„ ์Œ“์•„์„œ ์˜ฌ๋ฆฌ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

์–ดํ•ญ์ด ์Œ“์—ฌ์žˆ๋Š” ๋ถ€๋ถ„๋“ค๋งŒ ๋ชจ์•„์„œ 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
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€