[swea 1954-파이썬]달팽이 숫자
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]
와 같이 사용한다.
더 이상 이동할 수 없는 경우는 아래 그림과 같이 배열 인덱스를 벗어나거나, 이동하고자 하는 위치에 이미 값이 할당된 경우이다.
위 내용을 함수로 작성하면 다음과 같다.
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-=dx
와 col-=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()
댓글남기기