-
Python - 달팽이 배열 설명(1)프로그래밍/Python 2021. 6. 8. 00:48반응형
달팽이 배열
달팽이 배열은 주어진 수(n)에 맞춰 nxn의 이중 배열을 생성하여, 시계 방향으로 숫자가 순차적으로 저장되는 배열입니다.
달팽이 배열의 구현 아이디어
1. 한 변의 길이가 주어진 정사각형의 최외각에 숫자를 채워넣는 함수를 제작합니다. n=5일때의 결과는 아래 예시와 같을 것입니다.
2. 바깥에서 부터 1의 과정을 반복하여 한겹씩 채워나갑니다.
여기에서 알 수 있는 것을 알아봅시다.
- 위 예시 그림에서 사각형의 크기는 5->3->1로 -2의 차이를 보이고 있습니다.
- 2차원 리스트로 주어졌을 때, 각 반복마다(흰->초록->주황) 시작위치는 (0,0) -> (1,1) -> (2,2)가 됩니다.
이를 구현해봅시다.
혹시나 이해가 되지 않는 부분이 있다면, 망설이지 말고 댓글로 남겨주세요. 😀
1. 달팽이 배열의 행과 열의 크기로 쓰일 수를 입력 받습니다.
n = int(input())
2. 달팽이 배열을 해당 크기에 맞추어 초기화해줍니다.
snail = [[0 for j in range(n)] for i in range(n)]
3. 인자로 (배열, 해당 사각형의 시작위치, 사각형의 크기, 시작 숫자)를 받으며, 최외각을 채워주는 함수를 구현합니다.(아이디어의 1번)
def make_outer(arr, st, length, num): last = st+length-1 # 사각형 : (st,st)~(last,last) for c in range(st, last + 1): # 해당 최외각 사각형에서 첫째 행을 처리 -> (st,st)~(st,last)까지 작업 arr[st][c] = num num += 1 for r in range(st + 1, last + 1): # 해당 최외각 사각형에서 마지막 열을 처리 : (st,last)은 이미 차있음 -> (st+1,l)~(last,last)까지 작업 arr[r][last] = num num += 1 for c in range(last - 1, st - 1,-1): # 해당 최외각 사각형에서 마지막 행을 처리 : (last,last)은 이미 차있음 -> (last,last-1)~(last,st)까지 작업 arr[last][c] = num num += 1 for r in range(last - 1, st, -1): # 해당 최외각 사각형에서 첫번째 열을 처리 : (last,st), (st,st)은 이미 차있음 -> (last-1,st)~(st+1,st)까지 작업 arr[r][st] = num num += 1 return num
예시를 들어봅시다. n=5일 때 최외각을 채운 것입니다.
위 코드를 실행했을 때의 결과는 다음과 같습니다. 잘 작동하는 것을 확인할 수 있습니다.
4. 이제 이 함수를 반복해 사용하여 원하는 결과를 얻어봅시다.
앞서 알아낸 것을 복습해봅시다.
- 사각형의 시작 index는 (0,0) -> (1,1) -> (2,2) ... 와 같이 증가함을 알아냈습니다.
- 또한 사각형의 한 변의 길이가 2씩 감소하는 것을 알아냈습니다.
따라서 n=5일 때(5x5의 달팽이 배열)를 가정하여보면, 다음과 같은 코드가 됨을 알 수 있습니다.
이에 대한 결과는 다음과 같습니다. 정상적으로 작동하는 것을 알 수 있습니다.
이를 일반화하여 코드로 작생해봅시다.
위에 나와있는 함수는 제외하고 작성하였습니다.
n = int(input()) arr = [[0 for j in range(n)] for i in range(n)] num, st = 1, 0 while n > 0: num = make_outer(arr, st, n, num) n -= 2 st += 1 print(*arr, sep = '\n')
이 코드에 대한 실행결과는 다음과 같습니다. 각각 n=5, n=3인 경우입니다. 잘 작동하는 것을 알 수 있습니다.
최종 코드는 다음과 같습니다.
def make_outer(arr, st, length, num): last = st+length-1 # 사각형 : (st,st)~(last,last) for c in range(st, last + 1): # 해당 최외각 사각형에서 첫째 행을 처리 -> (st,st)~(st,last)까지 작업 arr[st][c] = num num += 1 for r in range(st + 1, last + 1): # 해당 최외각 사각형에서 마지막 열을 처리 : (st,last)은 이미 차있음 -> (st+1,l)~(last,last)까지 작업 arr[r][last] = num num += 1 for c in range(last - 1, st - 1,-1): # 해당 최외각 사각형에서 마지막 행을 처리 : (last,last)은 이미 차있음 -> (last,last-1)~(last,st)까지 작업 arr[last][c] = num num += 1 for r in range(last - 1, st, -1): # 해당 최외각 사각형에서 첫번째 열을 처리 : (last,st), (st,st)은 이미 차있음 -> (last-1,st)~(st+1,st)까지 작업 arr[r][st] = num num += 1 return num n = int(input()) arr = [[0 for j in range(n)] for i in range(n)] num, st = 1, 0 while n > 0: num = make_outer(arr, st, n, num) n -= 2 st += 1 print(*arr, sep = '\n')
다음에는 이 배열을 90*n의 각도로 회전하는 방법과 그 코드에 대해 알아보겠습니다.
궁금한 것이 있다면 댓글 달아주세요.😀
반응형'프로그래밍 > Python' 카테고리의 다른 글
"Python.h" No such file 오류 해결 : ft. WSL 시간 동기화 (1) 2022.03.20 파이썬 코드 암호화 (0) 2021.06.24 Python - lambda expr에 대한 상세한 설명. (0) 2021.06.06 Python - List Comprehension(리스트 표현식) (0) 2021.06.04 PyQt 폴더 선택 (0) 2021.05.29