문제링크
문제설명
달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.
다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.
[예제]
N이 3일 경우,
N이 4일 경우,
[제약사항]
달팽이의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)
[입력]
가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스에는 N이 주어진다.
문제풀이
이차원 배열에서의 주어진 조건(여기서는 시계방향)대로 인덱스에 접근하기 위한 구현 문제다.
방향전환, 범위체크 등이 가장 핵심이었으며
이전에 많이 비슷한 문제를 많이 풀어봤었지만 응용하려면 또 생각이 더 필요한 문제였던 것 같다.
코드
T = int(input())
for tc in range(1, T+1):
N = int(input())
arr = [[0 for _ in range(N)] for _ in range(N)]
dx = [0, 1, 0, -1] # (동, 남, 서, 북)
dy = [1, 0, -1, 0]
dir = 0
r, c = 0, 0
for num in range(1, N*N+1):
# 숫자 삽입
arr[r][c] = num
# 이동
r += dx[dir]
c += dy[dir]
# 해당 지역이 범위를 벗어났거나 이미 값이 있다면
if r < 0 or r >= N or c < 0 or c >= N or arr[r][c]:
# 이전상태로 다시이동
r -= dx[dir]
c -= dy[dir]
# 방향 바꾸기(동->남, 남->서, 서->북, 북 >동)
dir = (dir + 1) % 4
# 이동
r += dx[dir]
c += dy[dir]
print('#' + str(tc))
for row in arr:
print(*row)