[SWEA] 1954. 달팽이 숫자

야금야금 공부·2023년 5월 6일
0

SWEA

목록 보기
24/43
post-thumbnail

1954. 달팽이 숫자


틀린 문제 풀이

  • 4까지는 올바르게 출력이 되었는데, 5부터는 무한 루프를 돌면서 값이 출력되지 않았다.
t = int(input())

for i in range(1, t + 1):
    n = int(input())
    arr = [[0] * n for _ in range(n)]


    def reverse(array):
        array = array[::-1]
        array = list(map(list, zip(*array)))
        return array


    cnt = 1
    a = 0
    while cnt != n * n + 1:  # 90 도 회전
        for t in range(a, n):
            if not arr[a][t]:
                arr[a][t] = cnt
                cnt += 1

        if cnt == (4 * n - 3):
            a += 1

        for _ in range(3):
            arr = reverse(arr)

    while arr[0][0] != 1:
        arr = reverse(arr)

    print(f"#{i}")

    for a in arr:
        print(*a)

우 -> 하 -> 좌 -> 상 순으로 이동한다.
제일 처음 오른쪽 방향으로 이동을 3번이라고 생각하면, 3 -> 2 -> 2 -> 1 -> 1 순으로 루프를 돌 수 있다.
만약 N = 4라면, 4 -> 3 -> 3 -> 2 -> 2 -> 1 -> 1 순으로 루프를 돌 수 있다.

정답 코드

T = int(input())

for k in range(1, T + 1):
    N = int(input())

    # i, j를 증가를 저장할 리스트

    di = []
    dj = []

    for n in range(N, 0, -1):
        for _ in range(n):        # 1) N = 3이라면 먼저 n인 3번 오른쪽인 [0, 1]을 추가
            di.append(0)

            if (N - n) % 2 == 0:  
                dj.append(1)
            else:                 # 3) 3번째 이동방향은 왼쪽이므로, 홀수이면 [0, -1]을 2번 추가
                dj.append(-1)

        for _ in range(n - 1):    # 2) 그 다음 2번 아래로 [1, 0]을 추가 
            di.append(1 - (2 * ((N - n) % 2)))     # 4) [-1, 0]을 1번 추가
            dj.append(0)

    # 2차원 배열 초기화 : NxN
    arr = [[0] * N for _ in range(N)]

    i = j = 0
    for n in range(1, N * N + 1):
        if n == 1:            # 첫번째 값 arr[0][0] = 1
            arr[i][j] = 1
        else:
            i += di[n - 1]
            j += dj[n - 1]
            arr[i][j] = n

    print(f"#{k}")

    for list in arr:
        print(*list)


참고 블로그

0개의 댓글