[SW Expert Academy, SWEA 1954] 달팽이 숫자 (python)
Problem Solving/SWEA

[SW Expert Academy, SWEA 1954] 달팽이 숫자 (python)

728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=2

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

728x90

내 생각

2차 배열이 아닌 1차 배열로 풀었다.

0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

위와 같은 인덱스를 가진 1차배열을 보기 쉽게 4줄로 끊어서 배치했다고 생각한다.

 

저 배열에 달팽이 숫자로 수를 채우려면 다음과 같은 순서로 배열에 접근 해야 한다.

0 → 1 →  2 → 3 → 7 → 11 → 15 → 14 → 13 → 12 → 8 → 4 → 5 → 6 → 10 → 9

 

인덱스의 규칙을 잘 살펴보면,

 

+1 x3 (0 → 1 → 2 →3)

 

+4 x3 (3 → 7 → 11 → 15)

-1 x3 (15 → 14 → 13 →12)

 

-4 x2 (12 → 8 → 4)

+1 x2 (4 → 5 → 6)

 

+4 x1 (6 → 10)

-1 x1 (10 → 9)

 

와 같은 규칙을 보인다.

N=5인 경우,

+1 x4

 

+5 x4

-1 x4

 

-5 x3

+1 x3

 

+5 x2

-1 x2

 

-5 x1

+1 x1

와 같은 규칙을 보인다.

 

이 규칙을 사용해서 문제를 풀었다.

T = int(input())

for test_case in range(1, T + 1):
    N = int(input())
    #NxN의 1차 배열 생성
    arr = [0] * N * N
    num = 0

    #처음 N개는 처음부터 순서대로 배열에 넣어준다.
    for i in range(N):
        num  += 1
        arr[i] = num

    idx = N - 1
    for i in range(N - 1, 0, -2):
        for j in range(i):
            idx += N
            num += 1
            arr[idx] += num
        for j in range(i):
            idx -= 1
            num += 1
            arr[idx] += num
        for j in range(i - 1):
            idx -= N
            num += 1
            arr[idx] += num
        for j in range(i - 1):
            idx += 1
            num += 1
            arr[idx] += num

    print("#{}".format(test_case))
    for i in range(0, N*N, N):
        for j in range(N):
            print(arr[i + j], end=" ")
        print()
728x90