[프로그래머스][LV.0] 정수를 나선형으로 배치하기 | python3

2025. 2. 18. 09:07프로그래머스/LV.0

문제링크:  정수를 나선형으로 배치하기


문제설명

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

제한조건

- 1 ≤ n ≤ 30


 

문제풀이

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

예전에 여러가지 참고하면서 풀었던 풀이....
그때 정리했던 노션을 보면 

if num==1:
        return [[1]]

이걸 안써줘서 통과가 안됐다고 써있음.
 
수학에서 n=1 일때를 신경써줘야 하는 건 국룰인것같다. 
 
다시 풀어도 예전에 풀던 풀이만 기억에 남아서 비슷하게 풀었다.. 심지어 for문에서 범위값을 (n**2+1)을 안하고 (n+1)만 해서 틀림...
 


n*n 리스트를 0으로 초기화 해준다.
빙글빙글 리스트를 돌기때문에 맨 끝이거나 다음 행선지가 0이 아니면 방향을 바꾸어 준다.
혹시 몰라 n이 1일때의 코드를 주석처리하고 실행해보니 13번 하나만 에러가 난다. 아마 n이 1일때의 경우인 거겠지? 
n이 1 일때를 안써주면 인덱스 에러가 난다.
그리고 이걸 보니 다른 조건문에서도 인덱스 에러가 날 수 있는 거 아닌가? 하고 
 

if y==n-1 or answer[x][y+1]!=0:
를
if answer[x][y+1]!=0 or y==n-1:
로 바꾸어 써봤다

이렇게 쓰니 에러가 났다. or 뒷 조건에서 인덱스에러가 나기 전에 앞에서 조건이 맞아서 뒤에 조건을 실행을 안해서 인덱스 에러가 안나는 것 같다.

나의코드

def solution(n):
    if n==1:
        return [[1]]
    answer = [ [0]*n for _ in range(n)]
    
    temp='right'
    x,y=0,0
    for num in range(1,n**2 +1):
        answer[x][y]=num
        if temp=='right':
            y+=1
            if y==n-1 or answer[x][y+1]!=0:
                temp='down'
        elif temp=='down':
            x+=1
            if x==n-1 or answer[x+1][y]!=0:
                temp='left'
        elif temp=='left':
            y-=1
            if y==0 or answer[x][y-1]!=0:
                temp='up'
        elif temp=='up':
            x-=1
            if x==0 or answer[x-1][y]!=0:
                temp='right'
                
    return answer

 


 

더보기

참고하기

def solution(n):
    answer = [[0]* n for _ in range(n)]
    
    ##시계방향나선형 : 우 하 좌 상 방향으로
    dx= [0, 1, 0, -1] # 행
    dy= [1, 0, -1, 0] # 열
    x,y = 0,0 # 행, 열 인덱스. 시작점 초기화
    move= 0 # 방향 인덱스: move=0일때 dx[0], d[0] 으로 오른쪽 방향이라는 뜻
    
    for i in range(1, n*n +1):
        answer[x][y] = i  # 현재 위치에 해당 숫자 배치
        nx= x+ dx[move]
        ny= y+ dy[move]
        # 다음 위치(nx, ny)가 그리드 안에 있고 아직 숫자가 안채워졌으면 다음위치로 이동
        if 0 <= nx < n and 0 <= ny < n and answer[nx][ny] == 0:
            x = nx
            y = ny
        else: # 다음 위치 그리드 밖으로 나가거나 숫자 이미 있으면 방향을 바꿔서 다음 위치 지정
            move = (move + 1) % 4
            x= x + dx[move]
            y= y + dy[move]
        
    return answer

 

def solution(n):
    dy = [0, 1, 0, -1]
    dx = [1, 0, -1, 0]
    y, x = 0, -1

    arr = [[0] * n for _ in range(n)]
    cnt = 1
    direction = 0
    while cnt <= n**2:
        ny, nx = y + dy[direction], x + dx[direction]
        if 0 <= ny < n and 0 <= nx < n and not arr[ny][nx]:
            arr[ny][nx] = cnt
            cnt += 1
            y, x = ny, nx
        else:
            direction = (direction + 1) % 4

    return arr
def solution(n):
    dy = [0, 1, 0, -1]
    dx = [1, 0, -1, 0]
    y, x = 0, -1

    arr = [[0] * n for _ in range(n)]
    cnt = 1
    direction = 0
    while cnt <= n**2:
        ny, nx = y + dy[direction], x + dx[direction]
        if 0 <= ny < n and 0 <= nx < n and not arr[ny][nx]:
            arr[ny][nx] = cnt
            cnt += 1
            y, x = ny, nx
        else:
            direction = (direction + 1) % 4

    return arr

x와 y의 방향설정을 각각 리스트로 따로 구현.

=> (1,0) (0,1) (-1,0) (0,-1) 이렇게 4방향으로만 움직이는데 이걸 x좌표와 y좌표를 따로 리스트로 만들어서 구현함.

그리고 조건에 맞으면 값을 넣고 조건에 틀리면 방향을 바꾼다.

if문을 더 적게 쓰고 코드도 더 간결하게 가능.