[SW Expert] 달팽이 숫자 Python

권희정·2024년 11월 16일

삼성전자

목록 보기
19/20

[SW Expert] 달팽이 숫자 Python

쌩 노가다

예전에 이런 문제를 푼 기억이 나는데 어떻게 구현해야할 지 고민하다가 정말 쌩노가다로 구현으로 풀었다ㅋㅋ,,

t=int(input())
for test in range(1,t+1):
    n=int(input())
    #동,남,서,북
    #(남,서),(북,동)
    l=[[0 for _ in range(n)]for _ in range(n)]
    cnt=0
    num=n
    x,y=0,-1
    flag=False
    while True:
        #동쪽
        for i in range(num):
            y+=1
            cnt += 1
            l[x][y]=cnt
            if cnt==n*n:
                flag=True
                break
        if flag:
            break
        num-=1
        #남
        for i in range(num):
            x+=1
            cnt+=1
            l[x][y]=cnt
            if cnt==n*n:
                flag=True
                break
        if flag:
            break

        #서
        for i in range(num):
            y-=1
            cnt+=1
            l[x][y]=cnt
            if cnt==n*n:
                flag=True
                break
        if flag:
            break

        num-=1

        #북쪽
        for i in range(num):
            x-=1
            cnt+=1
            l[x][y]=cnt
            if cnt==n*n:
                flag=True
                break
        if flag:
            break
    print('#{}'.format(test))
    for i in l:
        print(*i)

다른 풀이를 참고하니 간단했다. 처음에 dx,dy를 활용해야겠다고 생각했는데 네 방향을 잡고 시작했다. 한가지 고민했던 점이 (남,서),(북,동)이 짝인걸 알았는데 처음에는 동쪽으로 n칸 이동해서 문제였다. 근데 처음 초기 좌표를 (0,0)으로 잡고 그 뒤부터 시작하니 해결됐다!

t=int(input())
dx=[0,1,0,-1] #동남서북
dy=[1,0,-1,0]

for test in range(1,t+1):
    n=int(input())
    l=[[0 for _ in range(n)]for _ in range(n)]

    x,y,cnt,d=0,0,1,0 #초기화 해주기
    l[x][y]=cnt
    cnt+=1

    while cnt<=n*n:
        nx=x+dx[d]
        ny=y+dy[d]

        if 0<=nx<n and 0<=ny<n and l[nx][ny]==0:
            x,y=nx,ny
            l[x][y]=cnt
            cnt+=1
        else:
            #방향 바꿔야함
            d=(d+1)%4

    print('#{}'.format(test))
    for i in l:
        print(*i)


profile
데헷큥

0개의 댓글