1 분 소요

swea 1954 달팽이 숫자

사용언어 : PYTHON

풀이

2차원 배열 N*N에서 달팽이 방향으로 이동하려면 오른쪽 이동->아래 이동->왼쪽 이동->위 이동 을 반복하면 된다.

행과 열 index 변수가 row, col 이라고 했을때,

오른쪽 이동 : row+=0, col+=1
아래 이동 : row+=1, col+=0
왼쪽 이동 : row+=0, col-=1
위 이동 : row-=1, col+=0

이 된다.

위에 설명한 가중치를 리스트로 표현하면 direction=[(0,1),(1,0),(0,-1),(-1,0)]와 같다.

방향을 전환하는 변수 direction_cnt을 사용하여 더 이상 이동할 수 없을때 1씩 증가시켜 방향을 전환한다.

이때 direction을 계속 돌아가며 전환해야 하기때문에 나머지 연산자를 이용해서 direction[direction_cnt%4]와 같이 사용한다.

더 이상 이동할 수 없는 경우는 아래 그림과 같이 배열 인덱스를 벗어나거나, 이동하고자 하는 위치에 이미 값이 할당된 경우이다.

👇

image

위 내용을 함수로 작성하면 다음과 같다.


def snail():
    cnt=1 # 1씩 증가하며 배열에 입력될 값
    row=col=0 # 배열 인덱스
    direction=[(0,1),(1,0),(0,-1),(-1,0)] 
    direction_cnt=0

    while True:
        
        answer[row][col]=cnt # 배열에 값 할당

        if cnt==N*N: # 다 채우면 함수 종료
            return
        dx,dy=direction[direction_cnt%4]  
        row+=dx
        col+=dy
        
        if row==N or col==N or col<0 or answer[row][col]!=0: # 밑에서 설명하는 if문 !
            row-=dx
            col-=dy
            cnt-=1
            direction_cnt+=1
       

        cnt+=1

if row==N or col==N or col<0 or answer[row][col]!=0: 에서 row-=dxcol-=dy를 통해 이전 값으로 되돌려 줘야한다.

또한 배열에 입력될 값 cnt 또한 cnt-=1을 통해 증가하지 않게 해줘야 한다.

❗ 그대로 두면 이전 위치에 1증가 된 값이 입력 돼버린다.

그리고 direction_cnt+=1을 통해 방향전환을 해준다.

코드


def snail():
    cnt=1
    row=col=0
    direction=[(0,1),(1,0),(0,-1),(-1,0)]
    direction_cnt=0

    while True:
        
        answer[row][col]=cnt

        if cnt==N*N:
            return
        dx,dy=direction[direction_cnt%4]
        row+=dx
        col+=dy
        
        if row==N or col==N or col<0 or answer[row][col]!=0:
            row-=dx
            col-=dy
            cnt-=1
            direction_cnt+=1
       

        cnt+=1


T=int(input())

for i in range(T):
    
    N=int(input())
    
    answer=[[0]*N for _ in range(N)]

    snail()
    
    print('#{}'.format(i+1))

    for p in answer:
        for q in p:
            print(q,end=' ')
        print()
    

댓글남기기