💻 coding test

[programmers / python] 정수를 나선형으로 배치하기

Floaty 2026. 6. 17. 12:00

https://school.programmers.co.kr/learn/courses/30/lessons/181832

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

말부터 쉽지 않아서 접근조차 막막했다. 알고리즘을 알고 있다면 특정 유형으로 바로 풀 수 있겠지만, 나는 알고리즘을 모른다. 냅다 해보려니 이중 for문 말고는 답이 보이지 않았고, 이것도 어떻게 짜야 할 지 감이 없었다. 그래서 이번엔 그냥 AI한테 맡겼다. 이해할 수 있다는 것에 의의를 두자는 마음으로..!

 

풀이의 핵심은 방향을 순서대로 관리하는 것이다. 나선형이라는 게 결국 오른쪽, 아래, 왼쪽, 의 순서로 꺾이는 패턴의 반복인데 방향을 배열로 미리 정의해두고 다음 칸이 범위를 벗어나거나 이미 채워진 경우에만 방향을 전환하면 된다. 

 

배열을 0으로 초기화하는 것까지는 혼자 생각해냈지만, 방향 전환 로직부터는 AI의 힘을 빌렸다. 

 

 

def solution(n):
    # [1] n×n 배열을 0으로 초기화
    result = [[0] * n for _ in range(n)]

    # [2] 이동 방향: 오른쪽 → 아래 → 왼쪽 → 위 순서
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    direction_idx = 0  # 현재 방향 인덱스

    x, y = 0, 0  # 현재 위치

    for num in range(1, n * n + 1):
        result[x][y] = num  # [3] 현재 위치에 숫자 채우기

        # 다음 위치 계산
        nx = x + directions[direction_idx][0]
        ny = y + directions[direction_idx][1]

        # [4] 다음 칸이 범위 밖이거나 이미 채워진 경우 방향 전환
        if not (0 <= nx < n and 0 <= ny < n) or result[nx][ny] != 0:
            direction_idx = (direction_idx + 1) % 4  # 다음 방향으로 (0→1→2→3→0)
            nx = x + directions[direction_idx][0]
            ny = y + directions[direction_idx][1]

        # [5] 다음 위치로 이동
        x, y = nx, ny

    return result