관리 메뉴

co-cherry

[SWEA] 1954. 달팽이 숫자 본문

Python

[SWEA] 1954. 달팽이 숫자

co-cherry 2026. 5. 20. 01:35

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일 때, 첫 숫자(0, 0)를 기준으로 2 2 2 1 1 로 이동하고,

n = 4일 때, 첫 숫자를 기준으로 3 3 3 2 2 1 1 로 이동하고,

n = 5일 때, 첫 숫자를 기준으로 4 4 4 3 3 2 2 1 1 로 이동한다. 

 

무조건 n보다 작은 수를 3번 반복 후, 1씩 감소하며 2번씩 반복하는 패턴을 보인다. 

이에 따라 이와 같은 규칙을 생성했다. 

 

moves = [n-1, n-1, n-1] + [i for i in range(n-2, 0, -1) for _ in range(2)]

 

그리고 moves에서 값을 하나씩 꺼내와 그 수만큼 이동한다. 이동을 다 했다면 방향을 전환한다. 

 

for test_case in range(1, T + 1):
    n = int(input())
    snail = [[0] * n for _ in range(n)]
    
    dx = [0, 1, 0, -1]  # 우 하 좌 상
    dy = [1, 0, -1, 0]
    
    x, y, direction = 0, 0, 0
    num = 1
    
    snail[x][y] = num
    num += 1
    
    moves = [n-1, n-1, n-1] + [i for i in range(n-2, 0, -1) for _ in range(2)]
    
    for move_count in moves:
        for _ in range(move_count):
            x += dx[direction]
            y += dy[direction]
            snail[x][y] = num
            num += 1
        
        direction = (direction + 1) % 4
    
    print(f'#{test_case}') 
    for i in range(n):
        for j in range(n):
            print(snail[i][j], end=" ")  
        print()

 

다른 방식

사실 위에서 이미 제시했지만, direction을 지정하는 방법을 직접 좌표 이동을 하는 것 외에 생각해내지 못했었다.

달팽이 숫자는 우 → 하 → 좌 → 상 순으로 반복해서 이동하는데, 

 

행렬을 기준으로 

  • 우로 이동 시, 열이 증가하므로 y 값이 증가한다.
  • 하로 이동 시, 행이 증가하므로 x 값이 증가한다. 
  • 좌로 이동 시, 열이 감소하므로 y 값이 감소한다.
  • 상으로 이동 시, 행이 감소하므로 x 값이 감소한다. 

이를 바탕으로 이동할 좌표를 dx, dy로 표시하면 

dx = [0, 1, 0, -1], dy = [1, 0, -1, 0] 와 같이 표시할 수 있다.

 

상하좌우 순이므로 초기 direction 값은 0 이고, 방향 업데이트 시 

nx = x + dx[direction], ny = y + dy[direction] 와 같이 방향 값을 적용하고 업데이트 한다.

업데이트 후에는 direction은 1을 더하면서 방향을 전환하되, 인덱스 값을 고려해 % 4를 꼭 거치는 작업이 필요하다. 

 

방향 업데이트는 위에 나의 방식과는 다르게 0보다 작거나 n-1보다 크거나 값이 이미 있을 때 꼭 방향을 전환해야 한다. 

 

T = int(input())
for test_case in range(1, T + 1):
    dx = [0, 1, 0, -1]
    dy = [1, 0, -1, 0] 
    
    n = int(input())
    snail = [[0] * n for _ in range(n)]
    
    x, y, direction = 0, 0, 0 
    num = 1
    
    for _ in range(n*n):
        snail[x][y] = num
        num += 1
        
        nx = x + dx[direction]
        ny = y + dy[direction]
        
        if nx < 0 or nx >= n or ny < 0 or ny >= n or snail[nx][ny] != 0:
            direction = (direction + 1) % 4 
            nx = x + dx[direction]
            ny = y + dy[direction]
        
        x, y = nx, ny

 

'Python' 카테고리의 다른 글

[SWEA] 1873. 배틀 필드  (0) 2026.05.21
[SWEA] 1974. 스도쿠 검증  (0) 2026.05.20
[SWEA] 26502. 쉬운 삼각형  (0) 2026.05.19
[SWEA] 26504. MST 만들기  (0) 2026.05.06
[SWEA] 372. 가능한 시험 점수  (0) 2026.05.06