알고리즘[Python]/프로그래머스

[ Lv 2 ] 행렬 테두리 회전하기

병훈1234 2021. 6. 23. 10:07

- main에 모두 사용하면 너무 복잡해질거 같아 rotate 함수 만들어 둠.

- 다음 예제에서는 먼저 왼쪽 위의 8을 따로 저장해둔 다음 반시계방향으로 한칸씩 밀리도록 구현한 뒤, 마지막 숫자인 8을 따로 [x1, y1+1]에 저장해두면 회전이 완료된다.

- 회전 과정에서는 매 순간 최솟값을 갱신해 주고, 회전이 종료되면 최솟값을 리턴한다.

def rotate(matrix, x1, y1, x2, y2):
    minvalue = 999999999
    last = matrix[x1][y1]

    for i in range(x1, x2):
        matrix[i][y1] = matrix[i+1][y1]
        minvalue = min(minvalue, matrix[i+1][y1])

    for j in range(y1, y2):
        matrix[x2][j] = matrix[x2][j+1]
        minvalue = min(minvalue, matrix[x2][j+1])

    for i in range(x2-1, x1-1, -1):
        matrix[i+1][y2] = matrix[i][y2]
        minvalue = min(minvalue, matrix[i][y2])

    for j in range(y2-1, y1, -1):
        matrix[x1][j+1] = matrix[x1][j]
        minvalue = min(minvalue, matrix[x1][j])

    matrix[x1][y1+1] = last
    minvalue = min(minvalue, last)
    return minvalue

def solution(rows, columns, queries):
    answer = []

    matrix = [[0] * (columns + 1) for _ in range(rows + 1)]
    for i in range(1, rows+1):
        for j in range(1, columns+1):
            matrix[i][j] = columns*(i-1)+j

    for query in queries:
        answer.append(rotate(matrix, query[0], query[1], query[2], query[3]))

    return answer

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges