ABOUT ME

Contact.
Email:yj.anthonyjo@gmail.com
Introduce : CS Student.

Today
-
Yesterday
-
Total
-
  • Python - 달팽이 배열 설명(1)
    프로그래밍/Python 2021. 6. 8. 00:48
    반응형

    달팽이 배열

    달팽이 배열은 주어진 수(n)에 맞춰 nxn의 이중 배열을 생성하여, 시계 방향으로 숫자가 순차적으로 저장되는 배열입니다.

    달팽이 배열의 구현 아이디어

    1. 한 변의 길이가 주어진 정사각형의 최외각에 숫자를 채워넣는 함수를 제작합니다. n=5일때의 결과는 아래 예시와 같을 것입니다.

    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의 각도로 회전하는 방법과 그 코드에 대해 알아보겠습니다.

     

    궁금한 것이 있다면 댓글 달아주세요.😀

    반응형

    댓글

Designed by Tistory.