코테 노트/프로그래머스

Level 2 행렬 테두리 회전하기 Python 3

화요밍 2022. 3. 6. 22:07
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/77485?language=python3 

 

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

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

 

최종 코드

 

GitHub - hwayeon351/Programmers-Algorithms: 프로그래머스 알고리즘 소스 코드 모음

프로그래머스 알고리즘 소스 코드 모음. Contribute to hwayeon351/Programmers-Algorithms development by creating an account on GitHub.

github.com

import heapq

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

    for r1, c1, r2, c2 in queries:
        nums = []
        temp = arr[r1][c1]
        
        #(r2, c1) -> (r1, c1)
        for r in range(r1, r2):
            arr[r][c1] = arr[r+1][c1]
            heapq.heappush(nums, arr[r+1][c1])
            
        #(r2, c2) -> (r2, c1)
        for c in range(c1, c2):
            arr[r2][c] = arr[r2][c+1]
            heapq.heappush(nums, arr[r2][c+1])
            
        #(r1, c2) -> (r2, c2)
        for r in range(r2, r1, -1):
            arr[r][c2] = arr[r-1][c2]
            heapq.heappush(nums, arr[r-1][c2])
            
        #(r1, c1) -> (r1, c2)
        for c in range(c2, c1+1, -1):
            arr[r1][c] = arr[r1][c-1]
            heapq.heappush(nums, arr[r1][c-1])
        arr[r1][c1+1] = temp
        heapq.heappush(nums, temp)
        
        answer.append(heapq.heappop(nums))   
    
    return answer

풀이 과정

풀이 시간 32분

import heapq

def solution(rows, columns, queries):
    answer = []
    
    #rowsXcolmns 배열 만들기
    arr = [[0]*(columns+1) for _ in range(rows+1)]
    
    num = 1
    for i in range(1, rows+1):
        for j in range(1, columns+1):
            arr[i][j] = num
            num += 1
	
    #시계 방향으로 1칸 회전 명령 시행
    for r1, c1, r2, c2 in queries:
    	#위치가 변한 숫자들을 담을 배열
        nums = []
        #가장 첫 번째 숫자 temp에 저장하기
        temp = arr[r1][c1]
        
        #(r2, c1) -> (r1, c1)로 값 이동
        for r in range(r1, r2):
            arr[r][c1] = arr[r+1][c1]
            heapq.heappush(nums, arr[r+1][c1])
            
        #(r2, c2) -> (r2, c1)로 값 이동
        for c in range(c1, c2):
            arr[r2][c] = arr[r2][c+1]
            heapq.heappush(nums, arr[r2][c+1])
            
        #(r1, c2) -> (r2, c2)로 값 이동
        for r in range(r2, r1, -1):
            arr[r][c2] = arr[r-1][c2]
            heapq.heappush(nums, arr[r-1][c2])
            
        #(r1, c1) -> (r1, c2)로 값 이동
        for c in range(c2, c1+1, -1):
            arr[r1][c] = arr[r1][c-1]
            heapq.heappush(nums, arr[r1][c-1])
        arr[r1][c1+1] = temp
        heapq.heappush(nums, temp)
        
        #Min heap에서 pop하여 가장 작은 수 answer에 담아주기
        answer.append(heapq.heappop(nums))   
    
    return answer

#시간복잡도 = O(n), 공간복잡도 = O(n)

 

728x90
반응형