co-cherry
[SWEA] 1954. 달팽이 숫자 본문
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 |
