https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=PYTHON&select-1=2&pageSize=10&pageIndex=2
요구사항
- 시간 제한 10개 테스트 케이스 합쳐서 30초? 테스트 케이스당 3초니깐 무제한 시간제한임 거의
- 메모리 제한도 256MB, 스택 메모리 1MB는 뭔지 모르겠다.
- 10이하 자연수를 입력하면 n x n 행렬을 출력해라. 시계 방향으로 돈다. 방문한 곳은 재방문하지 않는다.
설계
- 우선 2차원 빈 배열을 만들어야 한다. 예를 들어 [[0, 0] [0, 0]] 과 같이 0으로 초기화한 2차원 배열. 그 이유는 만약 가봤는 데 0이 아니라면 방문했다는 소리니깐..
- 방향 전환을 해야한다.
- dx = [0, 1, 0 -1]
- dy = [1, 0 ,-1 ,0]
- 그 이유는 처음에는 오른쪽으로 쭉.... 그다음에는 아래로 쭉... 왼쪽으로 쭉.... 위로 ... 반복
- 초기 좌표를 초기화한다. x = y = 0
- dx, dy 하나씩 증가시켜야 되고 배열의 범위를 넘어가는 경우 상하좌우로 4 주기마다 반복되기 때문에 %4를 이용한다.
- for문을 돌려 출력할 수 있도록 한다. for k in range(1, k+1)
- 초기좌표: 2차원배열[x][y] = k -> 2차원배열[0][0] = 1
- nx = x + dx[move] -> nx = 0 + 0
- ny = y + dy[move] -> ny = 0 + 1 : 오른쪽으로 이동...
- nx, ny 가 배열의 범위 안에 있는 지 확인 and 이동하려는 좌표의 값이 0인지 확인(방문여부)
- 만약 위 조건을 만족한다면, x와 y를 아래 값으로 업데이트
- x = nx -> x = 0
- y = ny -> y = 1
- 그렇지 않다면 (배열의 범위를 벗어나거나 방문했다면)
- move = (move + 1) % 4
- x += dx[move] -> x = 0 + 1
- y += dy[move] -> y = 0 + 0
구현
t = int(input())
for i in range(1, t + 1):
n = int(input())
matrix = [[0]*n for _ in range(n)]
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
x = y = 0
move = 0
for k in range(1, n*n + 1):
matrix[x][y] = k
nx = x + dx[move]
ny = y + dy[move]
if 0 <= nx < n and 0 <= ny < n and matrix[nx][ny] == 0:
x = nx
y = ny
else:
move = (move + 1) % 4
x += dx[move]
y += dy[move]
print(f"#{i}")
for a in matrix:
print(*a)