본문 바로가기

Algorithm/프로그래머스

[Python] [코딩 기초 트레이닝] / 정수를 나선형으로 배치하기

 

[문제 설명]

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



[제한사항]
1. 1 ≤ n ≤ 30

 

def solution(n):
    answer = [[]]
    return answer

 

 

* 유형 : 이차원 리스트(배열)

- dir = r, d, l, u

- r : y+1, d : x+1, l : y-1, u : x-1

- [[0 for j in range(n)] for i in range(n)]

 

 

 

[A] (내가 쓴 답)

def solution(n):
    
    answer = [[0 for j in range(n)] for i in range(n)]
    
    x = 0
    y = 0
    dir = 'r'
    
    if n == 1 :
        return [[1]]
    
    for i in range(n*n) :
        answer[x][y] = i+1
        
        if dir == 'r' :
            y += 1
            if y == n-1 or answer[x][y+1] != 0 :
                dir = 'd'
        elif dir == 'd' :
            x += 1
            if x == n-1 or answer[x+1][y] != 0 :
                dir = 'l'
        elif dir == 'l' :
            y -= 1
            if y == n-1 or answer[x][y-1] != 0 :
                dir = 'u'
        elif dir == 'u' :
            x -= 1
            if x == n-1 or answer[x-1][y] != 0 :
                dir = 'r'
                
    return answer

 

  • y == n-1 : 배열의 제일 끝에 도달했을 때,
  • arr[x][y+1] != 0 : 다음 칸을 봤을 때 0이 아닌 값 (= 이미 값이 있을 때)
  • n = 1일 때 out of range 나와서 처리 필요
  • answer[x][y] = i+1 : 값을 1부터 n*n으로 증가

 

 

[A] 다른 답들

def solution(n):
    return [[ 4*i*(n-i) + (1+x+y - 2*i if (x==i or y==n-i-1) else (4*n - 6*i - x - y -3))  for i,x,y in row]   for row in [[(min(n-x-1,x,n-y-1,y),x,y) for y in range(n)] for x in range(n)]]