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

Beanzinu·2022년 5월 23일

코딩테스트

목록 보기
31/42

문제출처: https://programmers.co.kr/learn/courses/30/lessons/77485

접근법

  1. 문제에 주어진 행렬들을 list comprehension을 통해 생성
  • 파이썬의 강력한 장점
  1. 쿼리에서 주어진 좌표들을 가지고 회전하는 함수를 작성
  • x1,y1 기준으로 시계방향으로 재귀함수를 호출하며 배열의 원소들을 이동시켰다.
  • 처음에는 새로운 배열로 복사해서 재귀함수가 끝나면 새로운 배열을 원 배열에 적용시켰는데 이렇게 되면 (쿼리문들의 개수) x (rows x columns 크기의 배열) 만큼 새로운 배열들을 생성하기 때문에 시간,메모리 효율적으로 매우 좋지 않았다.
  • 회전할때 현재 원소를 다음 원소에 덮어쓰는 식이므로 다음 원소를 잠시 저장해놨다가 다음 회전 시에 덮어씌어진 값을 전달하는 것이 아니라 덮어씌어지기 전의 값을 전달함으로써 새로운 배열 없이 안정적으로 전달할 수 있었다.
  • 현 위치의 좌표의 row 또는 col을 쿼리의 좌표들 중 하나의 값과 같은 지 비교하여 어디로 회전시켜야 하는 지 결정했다.
  • 각 재귀함수가 회전시키는 숫자들 중 가장 작은 숫자를 min_num 변수에 저장했는데 global을 통해 전역변수화 하지 않으면 rotate 함수에서 min_num을 접근할 수 없었다. rotate 함수에서 min_num을 지역 변수로 인식하기 때문
  1. 각 반복문에서 가장 작은 숫자인 min_num을 answer에 append

코드

import copy
def solution(rows, columns, queries):
    answer = []
    arr = [ [j for j in range((i-1)*columns+1,(i)*columns+1) ] for i in range(1,rows+1)]
    for q in queries:
        x1,y1,x2,y2 = q[0]-1,q[1]-1,q[2]-1,q[3]-1
        global min_num 
        min_num = 100000
        s = []
        def rotate(row,col,count):
            global min_num
            if( count and row == x1 and col == y1):
                return 
            before = s.pop() if s else arr[row][col]
            min_num = min(min_num,before)  
            if( row == x1 and col+1 <= y2 ):
                s.append(arr[row][col+1])
                arr[row][col+1] = before
                rotate(row,col+1,count+1)
            elif( col == y2 and row+1 <= x2 ):
                s.append(arr[row+1][col])
                arr[row+1][col] = before
                rotate(row+1,col,count+1)
            elif( row == x2 and col-1 >= y1 ):
                s.append(arr[row][col-1])
                arr[row][col-1] = before
                rotate(row,col-1,count+1)
            elif( col == y1 and row-1 >= x1 ):
                s.append(arr[row-1][col])
                arr[row-1][col] = before
                rotate(row-1,col,count+1)
        rotate(x1,y1,0)
        answer.append(min_num)
    return answer
profile
당신을 한 줄로 소개해보세요.

0개의 댓글