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
내가 놓친 점은 방향 전환을 위한 좌표 조정 부분이다.
대략적인 큰 알고리즘 설계는 어렵지 않다고 생각한다.
그러나 엣지 케이스에서 발생하는 처리들이 어렵다고 생각한다.
그렇기 때문에 알고리즘을 구성하는 절차 중에서 다음 절차로 넘어갈 때 엣지 케이스와 같은 것들이 발생하는지 파악하자.
(나는 조건이 종료되거나 시작되는 지점에서의 케이스도 엣지 케이스라고 표현했다. 나만의 임의적인 방법이니 오해 없길 바란다.)
또한 내가 원하는 조건을 수식으로 표현하는 방법에도 익숙해질 필요가 있다.