백준-17406-배열돌리기 4
업데이트:
문제
풀이
-
문제조건 해석
배열 회전하는 시뮬레이션 문제이다.
-
알고리즘
- 배열을 회전시키는 함수 만든다
- 바깥쪽에서 안쪽으로 회전 진행한다.
- 문제의 답은 모든 회전 연산에 대해 가장 최솟값을 구하는 경우
- 입력 순서대로가 아니다.
- 회전 순서에 따라 값이 변한다. 따라서 순열 사용함
- 배열을 회전시키는 함수 만든다
-
코드
from copy import deepcopy
from itertools import permutations
from sys import stdin
def rotate(r, c, s, arr):
for n in range(s, 0, -1):
tmp = arr[r-n][c+n]
arr[r-n][c-n+1:c+n+1] = arr[r-n][c-n:c+n]
for col in range(r-n, r+n):
arr[col][c-n] = arr[col+1][c-n]
arr[r+n][c-n:c+n] = arr[r+n][c-n+1:c+n+1]
for col in range(r+n, r-n, -1):
arr[col][c+n] = arr[col-1][c+n]
arr[r-n+1][c+n] = tmp
return arr
n, m, k = [int(x) for x in input().rstrip().split()]
origin_arr = []
for _ in range(n):
origin_arr.append([int(x) for x in input().rstrip().split()])
ops = []
for _ in range(k):
r, c, s = [int(x) for x in input().rstrip().split()]
r, c = r-1, c-1
ops.append((r,c,s))
answer = 100*50*50
results = {}
for op in permutations(ops):
if op not in results:
arr = deepcopy(origin_arr)
for r,c,s in op:
arr = rotate(r, c, s, arr)
results[op] = min(map(sum, arr))
print(min(results.values()))
-
배운점
- 문제를 꼼꼼히 이해해야 함. 입력 순서대로 회전 연산이 아니었음.
- 90도 변환 연산인 줄 알고 뻘짓함. 문제 제대로 이해하기.
-
deepcopy()
연산은 결국n*n
연산이다.- 시간초과 문제가 생겨났음.
댓글남기기