Programming/SW Expert Academy
20200724 // 삼성 SW Expert 아카데미 문제 // 1954
껨코
2020. 7. 24. 16:57
삼성 SW Expert 아카데미 1954번 "달팽이 숫자" 문제입니다.
TC = int(input())
for tc in range(1, TC+1):
N = int(input())
lst = []
direc= [0, 1, 2, 3]
for i in range(N):
lst.append([0]*N)
posX, posY = 0, 0
idx = 0
print("#%s"%tc)
for i in range(1, N*N+1):
lst[posX][posY] = i
if direc[idx] == 0: # 오른쪽 방향
if posY == N-1:
idx += 1
posX += 1
elif lst[posX][posY+1] != 0:
idx += 1
posX += 1
else:
posY += 1
elif direc[idx] == 1: # 아래쪽 방향
if posX == N-1:
idx += 1
posY -= 1
elif lst[posX+1][posY] != 0:
idx += 1
posY -= 1
else:
posX += 1
elif direc[idx] == 2: # 왼쪽 방향
if posY == 0:
idx += 1
posX -= 1
elif lst[posX][posY-1] != 0:
idx += 1
posX -= 1
else:
posY -= 1
elif direc[idx] == 3: # 위쪽 방향
if posX == 0:
idx = 0
posY += 1
elif lst[posX-1][posY] != 0:
idx = 0
posY += 1
else:
posX -= 1
for i in range(N):
for j in range(N):
print(lst[i][j], end=" ")
print()
예전에 대학교 과제로 한 번 나왔었던 문제 같은데 그 당시에는 못 풀었었던 기억이 있다. 지금은 풀었지만...
자신의 처음 위치를 정하고 방향을 정한다. 그리고 그 방향으로 나아가지 못할 시에 시계 방향 90도로 틀면 된다.
나아가지 못하는 경우는 두 가지, 자신이 나아갈 인덱스가 유효하지 않거나, 이미 채워져있는 즉 0이 아닐 경우다.
그 두 가지를 잘 고려하고 방향을 어떻게 트는지도 고려하면 어렵지 않게 풀 수 있다.