def solution(n):
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
matrix = [[0 for x in range(n)] for y in range(n)]
x, y = 0, 0
cnt = 1
while True:
# 아래 방향
while True:
if x >= n or y >= n or x < 0 or y < 0:
break
if matrix[y][x] != 0:
break
matrix[y][x] = cnt
cnt += 1
x += dx[3]
y += dy[3]
# 방향 전환을 위한 좌표 조정
x = x + dx[1] - dx[3]
y = y + dy[1] -dy[3]
# 오른쪽 방향
while True:
if x >= n or y >= n or x < 0 or y < 0:
break
if matrix[y][x] != 0:
break
matrix[y][x] = cnt
cnt += 1
x += dx[1]
y += dy[1]
# 방향 전환을 위한 좌표 조정
x = x + dx[0] - dx[1]
y = y + dy[2] - dy[1]
# 위쪽 대각선 방향
while True:
if x >= n or y >= n or x < 0 or y < 0:
break
if matrix[y][x] != 0:
break
matrix[y][x] = cnt
cnt += 1
x += dx[0]
y += dy[2]
# while문 재진입을 위한 좌표 조정
x = x + dx[3] - dx[0]
y = y + dy[3] - dy[2]
if x >= n or y >= n or x < 0 or y < 0:
break
if matrix[y][x] != 0:
break
answer = []
for row in matrix:
temp_row = [x for x in row if x != 0]
answer += temp_row
return answer
내가 놓친 점은 방향 전환을 위한 좌표 조정 부분이다.
대략적인 큰 알고리즘 설계는 어렵지 않다고 생각한다.
그러나 엣지 케이스에서 발생하는 처리들이 어렵다고 생각한다.
그렇기 때문에 알고리즘을 구성하는 절차 중에서 다음 절차로 넘어갈 때 엣지 케이스와 같은 것들이 발생하는지 파악하자.
(나는 조건이 종료되거나 시작되는 지점에서의 케이스도 엣지 케이스라고 표현했다. 나만의 임의적인 방법이니 오해 없길 바란다.)
또한 내가 원하는 조건을 수식으로 표현하는 방법에도 익숙해질 필요가 있다.