본문 바로가기
프로그래머스/Level_0

[프로그래머스] Lv.0 - 정수를 나선형으로 배치하기.py

by ro-jun 2026. 4. 4.
반응형

문제

  • 양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.

제한사항

  • 1 ≤ n ≤ 30

입출력 예

코드1 (효율X)

def solution(n):
    answer = [[0]*n for _ in range(n)] 
    x_line = list(range(0, n))
    y_line = list(range(0, n))
    x, num = 0, 0
    
    while(1):
        # 오른쪽 추가
        for y in range(min(y_line), max(y_line)+1):
            num += 1
            answer[x][y] = num
        x_line.remove(min(x_line))
        if len(x_line) == 0:
            break

        # 아래 추가
        for x in range(min(x_line), max(x_line)+1):
            num += 1
            answer[x][y] = num
        y_line.remove(max(y_line))
        if len(y_line) == 0:
            break

        # 왼쪽 추가
        for y in range(max(y_line), min(y_line)-1, -1):
            num += 1
            answer[x][y] = num
        x_line.remove(max(x_line))
        if len(x_line) == 0:
            break

        # 위 추가
        for x in range(max(x_line), min(x_line)-1, -1):
            num += 1
            answer[x][y] = num
        y_line.remove(min(y_line))
        if len(y_line) == 0:
            break
        
    return answer

 

코드2

def solution(n):
    answer = [[0]*n for _ in range(n)] 
    top, bottom = 0, n-1
    left, right = 0, n-1
    num = 1
    
    while(top <= bottom) and (left <= right):
        for y in range(left, right+1):
            answer[top][y] = num
            num +=1
        top += 1
        for x in range(top, bottom+1):
            answer[x][right] = num
            num +=1
        right -= 1
        for y in range(right, left-1, -1):
            answer[bottom][y] = num
            num +=1
        bottom -= 1
        for x in range(bottom, top-1, -1):
            answer[x][left] = num
            num +=1
        left += 1
        
    return answer

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

반응형