본문 바로가기
Algorithm/프로그래머스

[프로그래머스] Lv2 - 행렬 테두리 회전하기 (파이썬)

by _temp 2022. 3. 31.
 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

import sys


def solution(rows, columns, queries):
    arr = [[(i)*columns+(j+1) for j in range(columns)] for i in range(rows)]
    result = []
    for x1, y1, x2, y2 in queries:
        result.append(change(x1-1, y1-1, x2-1, y2-1, arr))
    return result


def change(x1, y1, x2, y2, arr):
    min_value = sys.maxsize
    # 맨 위의 맨 왼쪽 값을 기록
    temp = arr[x1][y1]
    # 왼쪽
    for k in range(x1, x2):
        arr[k][y1] = arr[k+1][y1]
        min_value = min(min_value, arr[k+1][y1])
    # 아래
    for k in range(y1, y2):
        arr[x2][k] = arr[x2][k+1]
        min_value = min(min_value, arr[x2][k+1])
    # 오른쪽
    for k in range(x2, x1, -1):
        arr[k][y2] = arr[k-1][y2]
        min_value = min(min_value, arr[k-1][y2])
    # 위
    for k in range(y2, y1+1, -1):
        arr[x1][k] = arr[x1][k-1]
        min_value = min(min_value, arr[x1][k-1])
    # 기록했던 값 업데이트
    arr[x1][y1+1] = temp
    min_value = min(min_value, temp)
    return min_value

 

풀이
1. 배열을 정의해준다.
2. change(x1, y1, x2, y2) : x1, y1 에서 x2, y2 까지의 행렬 테두리 시계방향으로 한번 회전
    - min_value : 이동한 숫자 중에서 가장 작은 값
    - 테두리 이동, min_value 초기화
    - min_value 리턴
3. result : 각 회전 마다 움직인 가장 작은 숫자들의 집합
4. result 리턴

 

한 꼭지점의 자리를 기억해 두고, 나머지는 전부 대입을 진행

이후, 기억해둔 값을 적절한 위치에 대입을 해주면 매번 값을 기억했다가 바꾸어줄 필요가 없다.