[백준] 17406번 배열돌리기 4 (파이썬)

dongEon·2023년 4월 25일
0

난이도 : GOLD IV

문제링크 : https://www.acmicpc.net/problem/17406

문제해결 아이디어

  • 지정된 범위의 가로세로는 2s 이다 => 결국 s 만큼 회전함
  • 좌 -> 하 -> 우 -> 상 순으로 회전을 시켰을때 (r-s,c-s+1) 값만 비정상적인 값이기 때문에 (r-s,c-s) 값을 tmp 로 저장한후 전체 회전후 값을 (r-s,c-s+1)에 대입해준다.

소스코드

from itertools import  permutations
import copy
import sys

input = sys.stdin.readline

n, m, k = map(int, input().split())

board = [[]]

for _ in range(n):
    board.append([0] + list(map(int, input().split())))

op = []

for _ in range(k):
    op.append(list(map(int, input().split())))


# r-s,c-s    r-s,c+s
# r+s,c-s    r+s,c+s


def rotate(o,graph):
    r, c, s = o

    for j in range(s):
        tmp = graph[r - s + j][c - s + j]
        for i in range(r - s + j, r + s - j):# 좌
            graph[i][c - s + j] = graph[i + 1][c - s + j]

        for i in range(c - s + j, c + s-j): # 하
            graph[r + s - j][i] = graph[r + s - j][i+1]

        for i in range(r + s - j, r - s + j, -1): #우
            graph[i][c + s - j] = graph[i - 1][c + s - j]

        for i in range(c + s - j, c - s + j, -1): # 상
            graph[r - s + j][i] = graph[r - s + j][i - 1]

        graph[r - s + j][c - s + 1 + j] = tmp



maxVal = int(1e9)
for z in permutations(op):
    g = copy.deepcopy(board)

    for i in z:
        rotate(i, g)

    for i in range(1,n+1):
        maxVal = min(maxVal, sum(g[i]))

print(maxVal)



profile
반갑습니다! 알고리즘 문제 풀이 정리 블로그 입니다. 피드백은 언제나 환영입니다!

0개의 댓글