[BOJ] 17406.๋ฐฐ์ด๋๋ฆฌ๊ธฐ4
by ๋๋ถ๋
17406๋ฒ: ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 4
ํฌ๊ธฐ๊ฐ N×M ํฌ๊ธฐ์ธ ๋ฐฐ์ด A๊ฐ ์์๋, ๋ฐฐ์ด A์ ๊ฐ์ ๊ฐ ํ์ ์๋ ๋ชจ๋ ์์ ํฉ ์ค ์ต์๊ฐ์ ์๋ฏธํ๋ค. ๋ฐฐ์ด A๊ฐ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ 1ํ์ ํฉ์ 6, 2ํ์ ํฉ์ 4, 3ํ์ ํฉ์ 15์ด๋ค. ๋ฐ๋ผ์, ๋ฐฐ์ด A์
www.acmicpc.net
์ด ๋ฌธ์ ๋ NxM ํฌ๊ธฐ์ ๋ฐฐ์ด A๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๋ฐฐ์ด A์ ๊ฐ์ ๊ฐ ํ์ ํฉ ์ค ์ต์๊ฐ์ ๋ํ๋ ๋๋ค.
๋ฐฐ์ด ํ์ ์ฐ์ฐ์ (r, c, s)๋ก ์ด๋ฃจ์ด์ ธ์๋๋ฐ, rํ c์ด์ ๋๋ฌ์ผ ์ ์ฌ๊ฐํ์ ์๊ณ๋ฐฉํฅ์ผ๋ก ๋๋ฆฝ๋๋ค.
์ฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ ๊ฐ์ฅ ์ผ์ชฝ ์์นธ์ด r-sํ, c-s์ด, ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ซ์นธ์ด r+sํ, c+sํ์ธ ์ ์ฌ๊ฐํ์ ๋๋ค.
๋ง์ฝ, s๊ฐ 2์ผ ๊ฒฝ์ฐ
๊ฐ์ฅ ์ผ์กฑ ์์นธ์ด r-s+1ํ, c-s+1์ด, ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ซ์นธ์ด r+s-1ํ, c+s-1ํ์ธ ์ ์ฌ๊ฐํ์ ๋ํด์๋ ์ํํด์ผ ํฉ๋๋ค.
ํ์ ์ฐ์ฐ ์์์ ๋ฐ๋ผ ์ต์๊ฐ์ด ๋ฌ๋ผ์ง๋ฏ๋ก ์ฐ์ฐ ์์์ ๋ํ ์์ด์ ๋ง๋ค์ด์ ํ์ ์ฐ์ฐ์ ์คํํฉ๋๋ค.
๋ํ, r, c๋ 1๋ถํฐ ์์์ด๋ฏ๋ก ์ค์ ์ฐ์ฐ ์์๋ r-1, c-1์ ๋ํด ์ํํด์ผ ํฉ๋๋ค.
๊ฐ๊ฐ์ ์์ด์ ๋ํด ํ์ ์ฐ์ฐ ์ํ ํ ๋ฐฐ์ด A์ ์ต์๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
# ๋ฐฐ์ด๋๋ฆฌ๊ธฐ4
import sys
input = sys.stdin.readline
def rotation(matrix, r, c, s) : # ํ์ ์ฐ์ฐ ํจ์
for i in range(s) :
r1, c1, r2, c2 = r-s+i, c-s+i, r+s-i, c+s-i # ๊ฐ์ฅ ์ผ์ชฝ ์์นธ r,c ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ซ์นธ r,c ์ ์ฅ
temp = matrix[r1][c1] # ๊ฐ์ฅ ์ผ์ชฝ ์์นธ ์ ์ฅ
# c1์ด
for idx in range(r1, r2) :
matrix[idx][c1] = matrix[idx+1][c1]
# r2ํ
for idx in range(c1, c2) :
matrix[r2][idx] = matrix[r2][idx+1]
# c2์ด
for idx in range(r2,r1,-1) :
matrix[idx][c2] = matrix[idx-1][c2]
# r1ํ
for idx in range(c2, c1+1, -1) :
matrix[r1][idx] = matrix[r1][idx-1]
matrix[r1][c1+1] = temp # ์ ์ฅํ ๊ฐ์ฅ ์ผ์กฑ ์์นธ ๊ฐ์ ๋ฐ๋ก ๋ค์ ์ด์ ๋ฃ์ด์ค
return matrix
def dfs(L, cur) : # ์์ด์ ๋ง๋ค์ด ํ์ ์ฐ์ฐ ์คํ ํ ์ต์๊ฐ์ ์ฐพ๋ ํจ์
global min_
if L == K :
opelist = [operation[idx] for idx in visitied]
copy_matrix = [m[:] for m in matrix]
for r, c, s in opelist :
copy_matrix = rotation(copy_matrix, r-1, c-1, s)
min_ = min(min_, min([sum(temp) for temp in copy_matrix]))
return
for i in range(K):
if visitied[i] == -1 : # ์์ง ๊ฐ์ ์ฑ์ฐ์ง ์์๋ค๋ฉด
visitied[i] = cur # ํ์ฌ ์ถ๊ฐํด์ผ ํ ์ธ๋ฑ์ค ๊ฐ ๋์
dfs(L + 1, cur + 1)
visitied[i] = -1
if __name__=="__main__" :
N, M, K = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(N)]
operation = [list(map(int, input().split())) for _ in range(K)]
min_ = 2147000000 # ๋ฐฐ์ด A์ ๊ฐ์ ํฐ ์๋ก ์ด๊ธฐํ
visitied = [-1] * K # ์์ด ์์ฑ์ ์ํ ๋ฆฌ์คํธ
dfs(0, 0)
print(min_)
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 11720.์ซ์์ ํฉ (Java) (0) | 2021.04.27 |
---|---|
[BOJ] 15685.๋๋๊ณค์ปค๋ธ (Python) (0) | 2021.04.23 |
[BOJ] 15686.์นํจ๋ฐฐ๋ฌ (Python) (0) | 2021.04.22 |
[BOJ] 17140.์ด์ฐจ์๋ฐฐ์ด๊ณผ ์ฐ์ฐ (Python) (0) | 2021.04.21 |
[BOJ] 14890.๊ฒฝ์ฌ๋ก (Python) (0) | 2021.04.20 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
๋๋ถ๋์ Devlog
๋๋ถ๋