[프로그래머스] 행렬 테두리 회전하기

섬섬's 개발일지·2022년 2월 11일
0

프로그래머스

목록 보기
12/50

문제

행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) column, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

  • rows는 2 이상 100 이하인 자연수입니다.
  • column는 2 이상 100 이하인 자연수입니다.
  • 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
    • 즉, 아무 회전도 하지 않았을 때, i행 j열에 있은 숫자는 ((i-1)x(columns+j))입니다.
  • queries의 행의 개수(회전의 개수)는 1 이상 10,000 이하입니다.
  • queries의 각 행은 4개의 정수 [x1,y1,x2,y2]입니다.
    • x1행 y1열부터 x2행 y2열까지 영역의 테두리를 시계방향으로 회전한다는 뜻입니다.
    • 1<=x1<x2<=rows, 1<=y1<y2<=columns 입니다.
    • 모든 회전은 순서대로 이루어집니다.
    • 예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.

코드

def solution(rows, columns, queries):
    answer = []
    board = [[0]*columns for _ in range(rows)]
    num = 1
    for row in range(rows):
        for column in range(columns):
            board[row][column] = num
            num += 1
    
    for x1,y1,x2,y2 in queries:
        tmp = board[x1-1][y1-1]
        result = [tmp]
        moveVertical(x1-1,y1-1,x2-1,1,board,result)
        moveHorizon(x2-1,y1-1,y2-1,1,board,result)
        moveVertical(x2-1,y2-1,x1-1,-1,board,result)
        moveHorizon(x1-1,y2-1,y1-1,-1,board,result)
        board[x1-1][y1] = tmp
        answer.append(min(result))
        
    return answer

def moveVertical(sx,sy,ex,direction,board,result):
    answer = board[sx][sy]
    for i in range(abs(sx-ex)):
        tmp = board[sx+(i*direction)+direction][sy]
        board[sx+(i*direction)][sy] = tmp
        answer = min(answer,tmp)
    result.append(answer)

def moveHorizon(sx,sy,ey,direction,board,result):
    answer = board[sx][sy]
    for i in range(abs(sy-ey)):
        tmp = board[sx][sy+(i*direction)+direction]
        board[sx][sy+(i*direction)] = tmp
        answer = min(answer,tmp)
    result.append(answer)
profile
섬나라 개발자

0개의 댓글