코딩테스트 연습 - 행렬 테두리 회전하기
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
'코딩테스트 준비 > 기타 문제들' 카테고리의 다른 글
프로그래머스 124나라 - 파이썬 (0) | 2021.06.10 |
---|---|
숫자의 개수 - 백준 2577 파이썬 (0) | 2021.05.27 |
최대값과 최대값의 자리 수 찾기 - 백준 2562 파이썬 (0) | 2021.05.27 |
최대, 최소 찾기 - 백준 10818 파이썬 (2) | 2021.05.27 |
input()보다 더 빠른 입력 방법 sys.stdin.readlin() (0) | 2021.05.11 |