PS/Python

[Programmers] 행렬 테두리 회전하기(파이썬, Python)

w00se 2021. 7. 18. 17:21

https://programmers.co.kr/learn/courses/30/lessons/77485

https://programmers.co.kr/learn/courses/30/lessons/77485

 

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

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

 

해당 문제는 Programmers의 2021 Dev-Matching: 웹 백엔드 개발자(상반기) 문제집에 있는 문제로 Level 2에 해당되는 문제입니다.

 

해당 문제는 queries에 직사각형 범위의 좌표가 주어지면 범위의 테두리에 있는 숫자들을 시계방향으로 한 칸씩 회전시키며 회전시키는 각 회차마다 가장 작은 수들을 구하는 게 목표입니다.

 

접근 방식

문제는 '테두리 회전 -> 회전한 수 중 가장 작은 수 구하기'의 과정을 queries 배열의 길이만큼 반복하면 됩니다.

 

저는 테두리 회전은 왼쪽 가장자리 -> 아래쪽 가장자리 -> 오른쪽 가장자리 -> 위쪽 가장자리 순으로 진행했습니다.

수평으로 이동시키는 경우는 slicing을 이용해서 구현했으며, 수직으로 이동시키는 경우는 반복문을 이용해서 구현했습니다.

 

각 회차마다 가장 작은 수는 단순 비교를 통해 구했습니다.

 

위의 접근 방식대로 적용한 코드는 아래와 같습니다.

전체 코드

제출 언어: Python 3

def rotation(mat, x1, y1, x2, y2):
    savedNum = mat[x1][y1]
    minNum = savedNum
    numList = [ savedNum ] 
    
    # 왼쪽 가장자리 위로 한 칸씩 밀기
    for j in range(x1, x2):
        mat[j][y1] = mat[j+1][y1] 
        
        if minNum > mat[j+1][y1]:
            minNum = mat[j+1][y1]
    
    # 아래쪽 가장자리 왼쪽으로 한 칸씩 밀기
    bottomList = mat[x2][y1+1:y2+1]
    mat[x2][y1:y2] = bottomList
    
    bottomMin = min(bottomList)
    if minNum > bottomMin:
        minNum = bottomMin
    
    # 오른쪽 가장자리 아래로 한 칸씩 밀기
    for j in range(x2, x1, -1):
        mat[j][y2] = mat[j-1][y2]
        
        if minNum > mat[j-1][y2]:
            minNum = mat[j-1][y2]
    
    # 위쪽 가장자리 오른쪽으로 한 칸씩 밀기
    topList = mat[x1][y1:y2]
    mat[x1][y1+1:y2+1] = topList
    
    topMin = min(topList)
    
    if minNum > topMin:
        minNum = topMin
        
    mat[x1][y1+1] = savedNum
    
    return minNum

def solution(rows, columns, queries):
    answer = []
    
    mat = []
    
    for i in range(1, rows+1):
        mat.append([ (i-1) * columns + j for j in range(1, columns+1) ])
    
    for query in queries:
        x1, y1, x2, y2 = query
        
        minNum = rotation(mat, x1-1, y1-1, x2-1, y2-1)
        
        answer.append(minNum)
         
    return answer

읽어 주셔서 감사합니다 :)

잘못된 부분이 있다면 댓글로 편히 알려주세요😊