[SWEA/Python] 1954번. 달팽이 숫자 (D2)

 

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq

 

SW Expert Academy

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

swexpertacademy.com

 

 

풀이

숫자는 1부터 (N*N)번까지 1씩 증가하며 입력되고 우, 하, 좌, 상 순서로 벽이나 이미 작성된 숫자를 만나면 방향을 이동하는것에 주의하면서 로직을 작성하면 된다.

 

우선 달팽이 숫자들을 저장할 N*N 리스트를 0으로 초기화 해놓는다.

 

move = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 우, 하, 좌, 상

move에 각 방향별 더해줄 y, x값을 미리 리스트로 선언한 다음

현재 방향의 값을 더한 새로운 newX, newY값을 구한 뒤, 


벽이나 이미 작성된 숫자와 만났다면 방향을 틀어준다.

(방향 인덱스에 1씩 더한뒤 나머지 연산을 통해 0,1,2,3가 계속 전환되도록 구현하였다)

if newX < 0 or newX >= N or newY < 0 or newY >= N:
    direction += 1
    continue

if snail[newY][newX] != 0:
    direction += 1
    continue

 

1부터 N*N까지 달팽이 숫자가 입력되었으면 반복문을 빠져나가고 달팽이 숫자들을 출력해준다.

 

 

 

정답 코드

T = int(input())
for i in range(T):
    print(f"#{i+1}")
    N = int(input())
    snail = [[0]*N for _ in range(N) ]

    y, x = 0, 0
    snail[y][x] = 1
    move = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 우, 하, 좌, 상
    direction = 0

    number = 1
    while number < N*N:
        newY = y + move[direction % 4][0]
        newX = x + move[direction % 4][1]

        if newX < 0 or newX >= N or newY < 0 or newY >= N:
            direction += 1
            continue

        if snail[newY][newX] != 0:
            direction += 1
            continue

        number += 1
        snail[newY][newX] = number
        y = newY
        x = newX

    for i in range(N):
        print(*snail[i])