알고리즘/알고리즘_swea

[Python][SWEA] 1954. 달팽이 숫자 D2

Jerry_K 2024. 5. 18. 17:02

🗒️ 파이썬 코드 풀이

T = int(input())
for tc in range(1,T+1):
    N = int(input())
    lst = [[0]*N for _ in range(N)]
    di,dj = [0,1,0,-1],[1,0,-1,0]
    i = j = k = 0
    lst[i][j] = 1
    cnt = 2

    while cnt <= N*N:
        ni,nj = i + di[k], j + dj[k]
        if 0 <= ni < N and 0 <= nj < N and lst[ni][nj] == 0 :
            i,j = ni,nj
            lst[i][j] = cnt
            cnt += 1
        else :
            k = (k+1)%4
            
    print(f"#{tc}")
    for i in range(N):
        for j in range(N):
            print(lst[i][j], end=" ")
        print()

 

1. di,dj 방향으로 문제를 푸는 방식이다.

 

2. 반복횟수는 cnt의 값이 N*N까지로 설정한다.

 

3. ni,nj의 값을  동-남-서-북 방향으로 진행 시킨다.  (처음 시작은 동쪽부터)

 

4. 범위는 0~N 까지이고 lst[ni][nj] = 0 인 지역만 가능하다. 

i,j 값은 조건에 통과된 ni,nj로 바꿔주고 새로운 lst[i][j]의 값에 cnt를 넣어준다.

 

5. 해당 조건에 맞지 않는다면 k의 값은 +1 해준다.  (4 이상의 값이 되면 다시 0으로 초기화)

 

 

🧐 문제 코멘트

D2에 정답률이 높은 문제이다. 

근데 나는 이 문제 왤케 어렵지 ...  일반적인 di,dj 문자와는 좀 다른 느낌이다. 

특히 while문을 쓰는데, 몇번을 어떻게 반복하고 제어할지 잘 생각하지 못했다.


📚 문제

달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.

다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.


[예제]

N이 3일 경우,
 


N이 4일 경우,
 


[제약사항]

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


[입력]

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

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


[출력]

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

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