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이 아닐 경우다.

 

그 두 가지를 잘 고려하고 방향을 어떻게 트는지도 고려하면 어렵지 않게 풀 수 있다.