728x90

https://programmers.co.kr/learn/courses/30/lessons/77485

출처 : 프로그래머스

 

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

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


풀이

 

matrix을 초기화 한다.

초기화 하는 방법은 어렵지 않다.

 

위의 그림은 회전 그림이다.

(x1, y1, x2, y2) 기준으로 회전을 한다.

처음에 노랗게 칠한 (2,2)을 tmp_min 변수에 저장한다. 

 

왼쪽부터 아래에 있는 것을 하나씩 위로 올린다.

왼쪽, 아래, 오른쪽, 위 순서대로 회전 코드를 썼다.

하나씩 밀다보면 matrix[x1][y1+1] 가 비어서 여기에 처음에 저장한 tmp_min을 넣어준다.

 

또, 주의할 점은 오른쪽과 위의 요소를 밀 때, 포문을 역순으로 돌아야 한다.

 

 

 

코드

def solution(rows, columns, queries):
    answer = []
    matrix = [[0 for c in range(columns + 1)] for r in range(rows + 1)]  # 초기화
    # 아무 회전도 안했을 때
    n = 1
    for i in range(1, rows + 1):
        for j in range(1, columns + 1):
            matrix[i][j] = n
            n += 1

    for x1, y1, x2, y2 in queries:
        tmp_min = matrix[x1][y1]
        tmp_copy = tmp_min

        # 회전
        for k in range(x1, x2):  # 왼쪽
            tmp = matrix[k+1][y1]
            matrix[k][y1] = tmp
            tmp_copy = min(tmp_copy, tmp)

        for k in range(y1, y2):  # 아래
            tmp = matrix[x2][k+1]
            matrix[x2][k] = tmp
            tmp_copy = min(tmp_copy, tmp)

        for k in range(x2, x1, -1):  # 오른쪽
            tmp = matrix[k-1][y2]
            matrix[k][y2] = tmp
            tmp_copy = min(tmp_copy, tmp)

        for k in range(y2, y1, -1):  # 위
            tmp = matrix[x1][k-1]
            matrix[x1][k] = tmp
            tmp_copy = min(tmp_copy, tmp)

        # 회전 마치고 바꾸기
        matrix[x1][y1+1] = tmp_min
        answer.append(tmp_copy)

    return answer

+ Recent posts