본문 바로가기
프로그래머스/Python

[프로그래머스] 행렬 테두리 회전하기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2024. 5. 19.
728x90
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 설명

반응형

2. 풀이과정

해당 문제는 알고리즘을 사용하지 않고 우선 차근차근 문제를 살펴보며 문제에서 실행되는 행동을 그대로 동작할 수 있도록 코드를 작성해 본다.

초기 행렬을 생성하는 함수, 회전하는 숫자들의 리스트를 생성하고 최솟값을 구하는 함수, 행렬을 회전 이후 행렬로 수정하는 함수를 각각 생성하여 활용한다.

 

  1. 초기 행렬을 생성하는 함수를 정의한다. def createMatrix(matrix)
    1. 한 행에 해당하는 리스트를 저장할 리스트를 생성한다. li = list()
    2. 숫자는 1부터 주어진 행과 열의 곱까지 들어가게 된다. for num in range(1, rows * columns + 1)
      1. 한 행에 해당하는 리스트에 숫자를 추가한다. li.append(num)
      2. 만약 숫자가 열 범위로 나누었을 때 0이면(한 행의 마지막 숫자이면) if (num % columns == 0)
        1. 해당 행을 행렬에 추가하고 matrix.append(li)
        2. 행의 숫자 리스트를 다시 빈 리스트로 초기화한다. li = list()
  2. 회전을 수행하는 숫자들 중 최솟값을 찾는 함수를 정의한다. def findMin(q)
    1. 회전을 수행하는 숫자들을 넣을 리스트를 생성한다. li = list()
    2. 초기 x좌표의 위치를 행렬의 인덱스 값으로 수정하여 저장한다. x = q[0] - 1
    3. 초기 y좌표의 위치를 행렬의 인덱스 값으로 수정하여 저장한다. y = q[1] - 1
    4. 회전을 수행하는 시작 위치의 숫자를 리스트에 넣는다. li.append(matrix[x][y])
    5. 이어서 회전을 수행하는 테두리의 위쪽 가로 행의 숫자를 차례대로 리스트에 추가한다. for i in range(q[3] - q[1]): li.append(matrix[x][y + i + 1])
    6. y좌표의 위치를 가로 행의 제일 오른쪽으로 이동한다. y = q[3] - 1
    7. 이어서 회전을 수행하는 테두리의 오른쪽 세로 열의 숫자를 차례대로 리스트에 추가한다. for i in range(q[2] - q[0]): li.append(matrix[x + i + 1][y])
    8. x좌표의 위치를 세로 열의 제일 아래쪽으로 이동한다. x = q[2] - 1
    9. 이어서 회전을 수행하는 테두리의 아래쪽 가로 행의 숫자를 차례대로 리스트에 추가한다. for i in range(q[3] - q[1]): li.append(matrix[x][y - i - 1])
    10. y좌표의 위치를 가로 행의 제일 왼쪽으로 이동한다. y = q[1] - 1
    11. 이어서 회전을 수행하는 테두리의 왼쪽 열의 숫자를 차례대로 리스트에 추가한다. for i in range(q[2] - q[0]): li.append(matrix[x - i - 1][y])
    12. 시작하는 위치의 숫자가 마지막에 중복으로 들어가므로 마지막 숫자를 제거한다. li.pop()
    13. 시계방향으로 숫자를 회전하여 다시 행렬을 수정해야 하므로 회전하는 숫자들을 오른쪽으로 한 칸씩 이동한다. 이동은 제일 뒤 숫자를 제일 앞으로 이동시키면 된다. li.insert(0, li.pop())
    14. 회전하는 숫자의 리스트에 있는 숫자들 중 최솟값을 정답 리스트에 추가한다. answer.append(min(li))
    15. 회전하는 숫자의 리스트를 반환한다. return li
  3. 회전 이후 행렬의 결과를 수정할 함수를 생성한다. def reMatrix(q, li)
    1. 초기 x좌표의 위치를 행렬의 인덱스 값으로 수정하여 저장한다.  x = q[0] - 1
    2. 초기 y좌표의 위치를 행렬의 인덱스 값으로 수정하여 저장한다. y = q[1] - 1
    3. 회전하는 숫자 리스트에서 숫자를 가져올 인덱스 번호를 지정할 변수를 생성한다. idx = 0
    4. 회전하는 테두리의 시작 위치에 회전하는 숫자의 리스트의 첫 번째 값을 넣어 수정한다. matrix[x][y] = li[idx]
    5. 회전하는 숫자 리스트의 인덱스 번호를 1 증가시킨다. idx += 1
    6. 이어서 회전을 수행하는 테두리의 위쪽 가로 행의 숫자를 차례대로 수정한다. for i in range(q[3] - q[1]): matrix[x][y + i + 1] = li[idx]
      1. 수정할 때마다 회전하는 숫자 리스트의 인덱스 번호를 1 증가시킨다. idx += 1
    7. y좌표의 위치를 가로 행의 제일 오른쪽으로 이동한다. y = q[3] - 1
    8. 이어서 회전을 수행하는 테두리의 오른쪽 세로 열의 숫자를 차례대로 수정한다. for i in range(q[2] - q[0]): matrix[x + i + 1][y] = li[idx]
      1. 수정할 때마다 회전하는 숫자 리스트의 인덱스 번호를 1 증가시킨다. idx += 1
    9. x좌표의 위치를 세로 열의 제일 아래쪽으로 이동한다. x = q[2] - 1
    10. 이어서 회전을 수행하는 테두리의 아래쪽 가로 행의 숫자를 차례대로 수정한다. for i in range(q[3] - q[1]): matrix[x][y - i - 1] = li[idx]
      1. 수정할 때마다 회전하는 숫자 리스트의 인덱스 번호를 1 증가시킨다. idx += 1
    11. y좌표의 위치를 가로 행의 제일 왼쪽으로 이동한다. y = q[1] - 1
    12. 이어서 회전을 수행하는 테두리의 왼쪽 열의 숫자를 차례대로 수정한다. for i in range(q[2] - q[0] - 1): matrix[x - i - 1][y] = li[idx]
      1. 수정할 때마다 회전하는 숫자 리스트의 인덱스 번호를 1 증가시킨다. idx += 1
  4. 초기 행렬을 저장할 리스트를 생성한다. matrix = []
  5. 초기 행렬을 생성하는 함수로 초기 행렬을 생성한다. createMatrix(matrix)
  6. 회전 목록에서 목록을 하나씩 불러오며 for q in queries
    1. 회전 목록을 기반으로 회전하는 숫자의 최솟값을 구하고 회전하는 숫자 리스트를 반환한다. li = findMin(q)
    2. 회전 목록과 구한 회전하는 숫자 리스트를 기반으로 행렬을 회전 이후 행렬로 수정한다. reMatrix(q, li)

3. 소스코드

def solution(rows, columns, queries):
    answer = []
    
    def createMatrix(matrix):
        li = list()
        for num in range(1, rows * columns + 1):
            li.append(num)
            if (num % columns == 0):
                matrix.append(li)
                li = list()
        
    def findMin(q):
        li = list()

        x = q[0] - 1
        y = q[1] - 1
        li.append(matrix[x][y])

        for i in range(q[3] - q[1]):
            li.append(matrix[x][y + i + 1])
            
        y = q[3] - 1
        for i in range(q[2] - q[0]):
            li.append(matrix[x + i + 1][y])
            
        x = q[2] - 1
        for i in range(q[3] - q[1]):
            li.append(matrix[x][y - i - 1])
            
        y = q[1] - 1
        for i in range(q[2] - q[0]):
            li.append(matrix[x - i - 1][y])
            
        li.pop()
        li.insert(0, li.pop())
        answer.append(min(li))

        return li

    def reMatrix(q, li):
        x = q[0] - 1
        y = q[1] - 1

        idx = 0
        matrix[x][y] = li[idx]
        idx += 1

        for i in range(q[3] - q[1]):
            matrix[x][y + i + 1] = li[idx]
            idx += 1
            
        y = q[3] - 1
        for i in range(q[2] - q[0]):
            matrix[x + i + 1][y] = li[idx]
            idx += 1
            
        x = q[2] - 1
        for i in range(q[3] - q[1]):
            matrix[x][y - i - 1] = li[idx]
            idx += 1
            
        y = q[1] - 1
        for i in range(q[2] - q[0] - 1):
            matrix[x - i - 1][y] = li[idx]
            idx += 1

    matrix = []
    createMatrix(matrix)

    for q in queries:
        li = findMin(q)
        reMatrix(q, li)
            
    return answer
728x90
반응형