1. 실패한 코드
달팽이 숫자는 프로그래머스의 달팽이 어쩌고와 유사한 문제로 생각해서 이 전에 풀었던 방식으로 접근을 하였다.
while문으로 돌려서 방향 벡터(0, 1, 2, 3)를 주고 y, x 2차원 배열의 위치 값을 새롭게 갱신해주면서 분기문을 하드코딩 했다.
문제 이해는 쉬운데 접근하는데 있어서 많은 생각을 해야만 했다.
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
N = int(input())
maps = [[0] * N for _ in range(N)]
if N == 1:
rotate = [1]
elif N == 2:
rotate = [1, 3]
else:
rotate = [1, 3]
for i in range(2, N):
rotate.append(rotate[i - 1] + i)
y, x = 0, 0
num = 1
idx = 0
while True:
if idx % 4 == 0:
maps[y][x] = num
x += 1
if x == N:
idx += 1
y += 1
x -= 1
if maps[y][x] != 0:
idx += 1
x -= 1
y += 1
elif idx % 4 == 1:
maps[y][x] = num
y += 1
if y == N:
idx += 1
x -= 1
y -= 1
if maps[y][x] != 0:
idx += 1
y -= 1
x -= 1
elif idx % 4 == 2:
maps[y][x] = num
x -= 1
if x == -1:
idx += 1
y -= 1
x += 1
if maps[y][x] != 0:
idx += 1
x += 1
y -= 1
elif idx % 4 == 3:
maps[y][x] = num
y -= 1
if maps[y][x] != 0:
idx += 1
y += 1
x += 1
# 종료
if idx + 1 == rotate[-1]:
break
num += 1
for i in range(N):
print(*maps[i])
2. 정답코드
다른 분들의 문제 해결 방안 피드백을 들으니 그래프 탐색으로 해결했다고 해서 본인도 그래프 탐색으로 해결했다.
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
N = int(input())
dy, dx = (0, 1, 0, -1), (1, 0, -1, 0)
maps = [[0] * N for _ in range(N)]
y, x = 0, 0
num = 1
idx = 0
while num <= (N * N):
maps[y][x] = num
y += dy[idx]
x += dx[idx]
if y < 0 or y >= N or x < 0 or x >= N:
y -= dy[idx]
x -= dx[idx]
idx = (idx + 1) % 4
y += dy[idx]
x += dx[idx]
elif maps[y][x] != 0:
y -= dy[idx]
x -= dx[idx]
idx = (idx + 1) % 4
y += dy[idx]
x += dx[idx]
num += 1
print(f'#{test_case}')
for i in range(N):
print(*maps[i])
'Algorithm > SWEA' 카테고리의 다른 글
[SWEA] D3. 상호의 배틀필드 (1) | 2022.11.14 |
---|---|
[SWEA] D3. 회문2 (0) | 2022.11.11 |
[SWEA] D3. N-Queen (0) | 2022.11.11 |
[SWEA] D3. Magnetic (0) | 2022.11.11 |
[SWEA] D3. 최대 상금 (0) | 2022.11.08 |