본문 바로가기
공부-코딩테스트/파이썬-코딩테스트-편의기능

달팽이 배열 만들기 (재귀함수사용)

by 령과 2021. 12. 26.

목표 : 대부분 한 번쯤은 봤을 달팽이 배열을 출력하는 함수를 코딩

코딩테스트를 볼 때 기본적으로 구현할 필요가 있는 부품으로 사용되는 것을 종종 보았다.

단순히 구현할 수 있었으나 막상 코딩테스트를 할 때 시간이 많이 걸린 경험이 있다.

시간 단축을 위해서 익숙해질 필요가 있다 생각하였다.

범용적으로 사용하기 위해 행, 열이 같을 필요가 없고,

시작값을 선택할 수 있는 달팽이 배열을 생성하는 함수를 코딩해 보았다.

 

행,열 값이 꼭 같을 필요가 없고, 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

댓글