문제

[프로그래머스] 행렬 테두리 회전하기 (LV. 2)

요약

  • n*n 크기의 정방행렬이 주어진다.
  • 왼쪽 위 꼭짓점과 오른쪽 아래 꼭짓점이 주어지면, 해당 사각형의 테두리를 회전시키자.
  • 회전시켜서 위치가 변한 숫자들 중 가장 작은 숫자를 순서대로 배열에 담아 반환.

분류

  • 배열

풀이

1. 내 풀이

  • 발상 : 최대한 직관적으로 생각했다. 굳이 분류하자면 시뮬레이션 정도. 문제에서 요구하는 것들을 실제로 실행하고 원하는 값을 구한다.
  • 마지막에 배열을 더해서 min() 연산하는 부분은 기억해두자. 다른 상황에서도 요긴하게 쓸 수 있을 듯. (현재 풀이에서 최선은 아니다. 추가 비용 들어감.)


import sys

def solution(rows, columns, queries):
    arr = [[(i) * columns + (j + 1) for j in range(columns)] for i in range(rows)]

    ans = []

    for y1, x1, y2, x2 in queries:
        min_num = sys.maxsize;

        y1 -= 1; x1 -= 1; y2 -= 1; x2 -= 1

        temp_x1y2 = arr[y2][x1]
        temp_x2y1 = arr[y1][x2]

        for i in range(x2, x1, -1):
            arr[y1][i] = arr[y1][i - 1]
        for j in range(x1, x2):
            arr[y2][j] = arr[y2][j + 1]

        for k in range(y1, y2 - 1):
            arr[k][x1] = arr[k + 1][x1]
        for l in range(y2, y1, -1):
            arr[l][x2] = arr[l - 1][x2]

        arr[y2 - 1][x1] = temp_x1y2
        arr[y1 + 1][x2] = temp_x2y1

        min_num = min(arr[y1][x1 : x2 + 1] + arr[y2][x1 : x2 + 1] + [arr[var][x1] for var in range(y1 + 1, y2)] + [arr[var][x2] for var in range(y1 + 1, y2)])
        ans.append(min_num)

    return ans

2. 최적화 풀이

  • <취업과 이직을 위한 프로그래머스 코딩테스트 문제 풀이 전략> 을 참고한 코드입니다. (링크)
  • 발상 : 리스트 슬라이싱을 이용한 for문 최적화.
def solution(rows, columns, queries):
    answer = []
    board = [[columns * j + (i+1) for i in range(columns)] for j in range(rows)]
    for query in queries:
        a, b, c, d = query[0]-1, query[1]-1, query[2]-1, query[3]-1
        row1, row2 = board[a][b:d], board[c][b+1:d+1]
        _min = min(row1 + row2)

        for i in range(c, a, -1):
            board[i][d] = board[i-1][d]
            if board[i][d] < _min: _min = board[i][d]

        for i in range(a, c):
            board[i][b] = board[i+1][b]
            if board[i][b] < _min: _min = board[i][b]

        board[a][b+1:d+1], board[c][b:d] = row1, row2

        answer.append(_min)

    return answer