코딩테스트 준비/기타 문제들

프로그래머스 행렬 테두리 회전하기 - 파이썬

갑자기 내리는 비 2021. 6. 12. 23:01
 

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

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

N x M 행렬에서 두 점을 선택해, 시계방향으로 회전시킵니다. 회전시키는 숫자 중 가장 적은 수를 추출합니다.

예를들어, 5x5 행렬에서 2,2 좌표와 4,4좌표를 선택한다면 아래와 같이 선택된 숫자들만 회전합니다.

 

문제를 푸는 방법을 생각해보겠습니다.

- 해당 좌표를 이용해 매트릭스의 범위를 뽑아낼 것입니다.

- 뽑아낸 데이터들을 순서대로 리스트로 받아 맨 마지막 값을 앞으로 땡겨줍니다.

- 매트릭스의 데이터를 뽑아낼때와 마찬가지로 반복문을 사용하는데,

- 이 때에는 리스트에 저장된 값을 순서대로 입력합니다.

 

from collections import deque
import numpy as np

# 매트릭스의 값을 추출하기 위한 함수
def extract_num():   
    extract_list = deque()

    for x in range(x1,x2):      # 맨 위.
        extract_list.append(array[y1][x])
    for y in range (y1, y2):    # 오른쪽
        extract_list.append(array[y][x2])
    for x in range(x2, x1, -1): # 하단
        extract_list.append( array[y2][x] )
    for y in range(y2,y1,-1):   # 왼쪽
        extract_list.append( array[y][x1])

    extract_list.insert(0,extract_list[-1])
    del extract_list[-1]

    return extract_list

# 추출한 데이터의 마지막을 맨 앞으로 바꿔 원래의 자리에 입력하는 함수.
def chang_num(lst):
    for x in range(x1,x2):      # 맨 위.
        array[y1][x] = lst.popleft()
    for y in range (y1, y2):    # 오른쪽
        array[y][x2] = lst.popleft()
    for x in range(x2, x1, -1): # 하단
        array[y2][x] = lst.popleft()
    for y in range(y2,y1,-1):   # 왼쪽
        array[y][x1] = lst.popleft()

# 최소값 찾는 함수
def find_min(lst):
    tmp=10000
    for num in lst:
        if tmp > num:
            tmp = num
    return tmp

def solution(rows, columns, queries):
    answer = []
    # 입력받은 rows와 columns를 이용해 행렬을 생성합니다.
    ori_array = (np.arange(rows*columns).reshape(rows,columns) + 1)

    global array
    # 함수 호출할 때마다 행렬을 복사하면 시간이 오래걸릴 것 같아 전역변수로 선언했습니다.
    array = ori_array.tolist()
    # np.arange()로 생성한 행렬의 데이터를 변환할 때, 
    # 데이터 타입 오류가 발생. 리스트로 변환합니다.
    
    # 입력받은 좌표를 받아올 변수들입니다.
    global x1,y1,x2,y2

    for ext_list in queries:
        y1,x1,y2,x2 = ext_list
        x1=x1-1
        y1=y1-1
        x2=x2-1
        y2=y2-1
    # 행렬은 0,0부터 시작하므로 모두 -1합니다.
    
    
    # 위의 함수들을 이용합니다.
    # 행렬의 회전할 좌표의 데이터들을 추출해 최소값을 찾고, 
    # 마지막 숫자를 맨 앞으로 옮깁니다.
    # 추출한 숫자의 최소값을 찾고
    # 추출한 값을 해당 좌표에 순서대로 입력합니다.
        extract_list = extract_num()
        answer.append( find_min(extract_list) )
        chang_num(extract_list)

    return answer