[Algorithm/Python][SWEA] 1954번 달팽이 숫자

동글이·2022년 11월 9일
0

Algorithm

목록 보기
31/33

[SWEA] 1954. 달팽이 숫자

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&problemLevel=3&contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=ALL&select-1=3&pageSize=10&pageIndex=1

- 문제 접근

  • 얻은 꿀팁 :
    - print 할 때, 리스트 앞에 * 를 붙이면 []가 출력되지 않는다
  • 나는 약간 막노동 비슷하게 불었는데 알고리즘 적으로 고민해보면 훨씨 잘짜여진 패턴을 가진 코드를 짤 수 있다. 알고리즘적인 고민을 조금 더 해보고 짜는 습관을 들이자..!

- 내 코드

T=int(input())

for t in range(T):
    N=int(input())
    snail=[[0]*N for i in range(1,N+1)]
    length=N
    step="right"
    number=1
    row=0
    col=0
    while(length!=0):
        if step=="right":
            for _ in range(length):
                snail[row][col]=number
                number+=1
                col+=1
            length-=1
            step="down"
            row+=1
            col-=1
        elif step=="down":
            for _ in range(length):
                snail[row][col]=number
                number+=1
                row+=1
            step="left"
            row-=1
            col-=1
        elif step=="left":
            for _ in range(length):
                snail[row][col]=number
                number+=1
                col-=1
            length-=1
            step = "up"
            row-=1
            col+=1
        elif step=="up":
            for _ in range(length):
                snail[row][col]=number
                number+=1
                row-=1
            step="right"
            row+=1
            col+=1
    print("#{}".format(t+1))
    # for i in range(N):
    #     for j in range(N):
    #         print(str(snail[i][j]), end= " ")
    #     print()
    for i in range(N):
        print(*snail[i])

- 더 멋진 코드

T = int(input())

# row, col 인덱스로 탐색할 수 있게 방향 설정 (달팽이 방향이니까 우->하->좌->상)
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]

for tc in range(1, T+1):
    N = int(input())
    snail = [[0]*N for _ in range(N)]
    # 초기 위치 & 회전방향 설정
    r, c = 0, 0
    dist = 0  # 0:우, 1:하, 2:좌, 3:상

    for n in range(1, N*N + 1):
        snail[r][c] = n
        r += dr[dist]
        c += dc[dist]

        # 범위를 벗어나거나 0이 아닌 다른 값이 이미 있다면, dist 방향 체인지
        # 근데 이런 경우라면 요소 인덱스를 다시 원위치시켜줘야하므로 빼줘야함
        # 그런다음 dist의 방향을 바꾸고, 방향 바꿨으면 다시 움직일 수 있도록 행렬 인덱스 업데이트
        if r < 0 or c < 0 or r >= N or c >= N or snail[r][c] != 0:
            # 실행취소
            r -= dr[dist]
            c -= dc[dist]
            # dist는 % 4 안해주면 0123, 4567, ... 이런식으로 숫자 커지므로 나머지로 접근
            dist = (dist + 1) % 4
            #  다시 gogo
            r += dr[dist]
            c += dc[dist]

    print("#{}".format(tc))
    for row in snail:
        print(*row)
    print()
profile
기죽지 않는 개발자

0개의 댓글