1954. 달팽이 숫자(달팽이, 소용돌이)

파송송계란빡 ㅣ 2022. 5. 19. 02:22

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

 

SW Expert Academy

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

swexpertacademy.com

 

[예제]

N이 3일 경우,
 


N이 4일 경우,
 

[제약사항]

달팽이의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)


[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스에는 N이 주어진다.


[출력]

각 줄은 '#t'로 시작하고, 다음 줄부터 빈칸을 사이에 두고 달팽이 숫자를 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
입력2    
3   
4             

출력#1
1 2 3
8 9 4
7 6 5
#2
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

 

import sys
sys.stdin = open("달팽이.txt", "r")

def solution(n):
    board = [[0]*n for _ in range(n)]      #n*n 배열 만들기
    x, y = 0, -1                           #시작 x, y
    dx = [0, 1, 0, -1]                     #위, 오른쪽, 아래, 왼쪽
    dy = [1, 0, -1, 0]
    loop = n                               #꺽이는 개수(5 4 4 3 3 2 2 1)
    num = 0                                #보드에 삽입될 숫자 1, 2, 3,...n*n
    dir = 0                                #0 1 2 3 0 1 2 3 ...

    while num < n * n :
        for _ in range(loop) :             #5, 4, 4, 3, 3만큼 방향이동
            x += dx[dir]
            y += dy[dir]
            num += 1
            board[x][y] = num
            #print(x, y)

        dir = (dir + 1) % 4                     #(방향) 0 1 2 3 0 1 2 3 0
        if dir % 2 != 0 :                       #홀수인 경우 -1 해줌
            loop -= 1

    return board

T = int(input())
for tc in range(T) :
    n = int(input())
    result = solution(n)
    
    print(f"#{tc+1}")
    for i in result :
        print(" ".join(map(str, i)))

# [[1, 2, 3, 4, 5], 
# [16, 17, 18, 19, 6], 
# [15, 24, 25, 20, 7], 
# [14, 23, 22, 21, 8], 
# [13, 12, 11, 10, 9]]
1954. 달팽이 숫자(달팽이, 소용돌이)