목표 : 대부분 한 번쯤은 봤을 달팽이 배열을 출력하는 함수를 코딩
코딩테스트를 볼 때 기본적으로 구현할 필요가 있는 부품으로 사용되는 것을 종종 보았다.
단순히 구현할 수 있었으나 막상 코딩테스트를 할 때 시간이 많이 걸린 경험이 있다.
시간 단축을 위해서 익숙해질 필요가 있다 생각하였다.
범용적으로 사용하기 위해 행, 열이 같을 필요가 없고,
시작값을 선택할 수 있는 달팽이 배열을 생성하는 함수를 코딩해 보았다.
행,열 값이 꼭 같을 필요가 없고, 1*1이나 1*6 사각형에도 적용할 수 있도록 코드하는 것이 목표.
1이상의 행,열 값과 시작하고자 하는 값을 input으로 받는다.
import numpy as np
def TMP(row,column,start):
if row==1 or column==1:
return np.array(range(start,start+max(row,column))).reshape((row,column))
else:
tmp=np.array(range(start,start+2*row+2*column-4)).reshape(2,row+column-2)
tmp[1]=list(reversed(list(tmp[1])))
matrix=np.zeros((row,column),dtype=int)
matrix[0,:-1]=tmp[0][:column-1]
matrix[:-1,-1]=tmp[0][column-1:]
matrix[-1,1:]=tmp[1][row-1:]
matrix[1:,0]=tmp[1][:row-1]
#print(matrix)
if not (row==2 or column==2):
matrix[1:-1,1:-1]=TMP(row-2,column-2,tmp[1][0]+1)
return matrix
접근 방법
크게 4가지 부분으로 나누어 생각한다.
1,3번의 길이는 인자로 row값에 영향을 받는다.
2,4번의 길이는 인자로 column값에 영향을 받는다.
1,2,3,4번을 채우기 위해서
np.array(range(start,start+2*row+2*column-4)) 을 작성한다.
그리고 reshape를 사용하고 행을 2로 하여 두 부분으로 나눈다.
tmp리스트에서 첫번째 행은 1,2번 그리고 두번째 행은 3,4번에 들어갈 정보가 저장된다.
그리고 행열 길이만큼 적절히 split하면 1,2,3,4번에 값을 채울 수 있게 자를 수 있다.
단 3,4번 자리는 채우기 위해 거꾸로 뒤집어야 하므로 reversed를 사용하였다.
matrix[~,~]=tmp[~][~]형태의 4줄 코드가 1,2,3,4번 영역을 채우는 코드이다.
재귀 개념을 적용하기 위해 어떠한 상황에서 멈춰야 할지 고려해야 한다.
행,열 중 하나라도 1 혹은 2 값을 가진다면 재귀로 더 들어갈 수 없다.
(재귀로 들어갈 때마다 테두리를 제외해야 하므로 -2를 하기 때문에)
행 또는 열 값에 1이 있다면?
시작값을 시작으로 1씩 증가하는 리스트(크기:행 또는 열 값 중 가장 큰 값)를 return하면 broadcasting으로 만들어진다.
행 또는 열 값에 2가 있다면?
더이상 처리할 필요가 없다. 따라서 전부 2이상 값을 가질 때 재귀호출을 하면 달팽이 배열이 만들어진다.
1,2,3,4번에 둘러쌓인 0 영역은 재귀호출을 이용하여 완성시킨다.
예시 TMP(행,열,시작값) ==> 행,열 >=1
'공부-코딩테스트 > 파이썬-코딩테스트-편의기능' 카테고리의 다른 글
heapq (0) | 2022.12.12 |
---|---|
약수 구하기 (0) | 2022.02.21 |
파이썬 format함수 (2) | 2022.01.05 |
파이썬 dictionary 사용 (0) | 2021.12.26 |
댓글