
예전에 이런 문제를 푼 기억이 나는데 어떻게 구현해야할 지 고민하다가 정말 쌩노가다로 구현으로 풀었다ㅋㅋ,,
t=int(input())
for test in range(1,t+1):
n=int(input())
#동,남,서,북
#(남,서),(북,동)
l=[[0 for _ in range(n)]for _ in range(n)]
cnt=0
num=n
x,y=0,-1
flag=False
while True:
#동쪽
for i in range(num):
y+=1
cnt += 1
l[x][y]=cnt
if cnt==n*n:
flag=True
break
if flag:
break
num-=1
#남
for i in range(num):
x+=1
cnt+=1
l[x][y]=cnt
if cnt==n*n:
flag=True
break
if flag:
break
#서
for i in range(num):
y-=1
cnt+=1
l[x][y]=cnt
if cnt==n*n:
flag=True
break
if flag:
break
num-=1
#북쪽
for i in range(num):
x-=1
cnt+=1
l[x][y]=cnt
if cnt==n*n:
flag=True
break
if flag:
break
print('#{}'.format(test))
for i in l:
print(*i)
다른 풀이를 참고하니 간단했다. 처음에 dx,dy를 활용해야겠다고 생각했는데 네 방향을 잡고 시작했다. 한가지 고민했던 점이 (남,서),(북,동)이 짝인걸 알았는데 처음에는 동쪽으로 n칸 이동해서 문제였다. 근데 처음 초기 좌표를 (0,0)으로 잡고 그 뒤부터 시작하니 해결됐다!
t=int(input())
dx=[0,1,0,-1] #동남서북
dy=[1,0,-1,0]
for test in range(1,t+1):
n=int(input())
l=[[0 for _ in range(n)]for _ in range(n)]
x,y,cnt,d=0,0,1,0 #초기화 해주기
l[x][y]=cnt
cnt+=1
while cnt<=n*n:
nx=x+dx[d]
ny=y+dy[d]
if 0<=nx<n and 0<=ny<n and l[nx][ny]==0:
x,y=nx,ny
l[x][y]=cnt
cnt+=1
else:
#방향 바꿔야함
d=(d+1)%4
print('#{}'.format(test))
for i in l:
print(*i)