본문 바로가기

Algorithm/SWEA

[SWEA] D2. 달팽이 숫자

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

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

1. 실패한 코드

달팽이 숫자는 프로그래머스의 달팽이 어쩌고와 유사한 문제로 생각해서 이 전에 풀었던 방식으로 접근을 하였다.

while문으로 돌려서 방향 벡터(0, 1, 2, 3)를 주고 y, x 2차원 배열의 위치 값을 새롭게 갱신해주면서 분기문을 하드코딩 했다.
문제 이해는 쉬운데 접근하는데 있어서 많은 생각을 해야만 했다.
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    N = int(input())
    maps = [[0] * N for _ in range(N)]

    if N == 1:
        rotate = [1]
    elif N == 2:
        rotate = [1, 3]
    else:
        rotate = [1, 3]
        for i in range(2, N):
            rotate.append(rotate[i - 1] + i)

    y, x = 0, 0
    num = 1

    idx = 0
    while True:
        if idx % 4 == 0:
            maps[y][x] = num
            x += 1
            if x == N:
                idx += 1
                y += 1
                x -= 1
            if maps[y][x] != 0:
                idx += 1
                x -= 1
                y += 1
        elif idx % 4 == 1:
            maps[y][x] = num
            y += 1
            if y == N:
                idx += 1
                x -= 1
                y -= 1
            if maps[y][x] != 0:
                idx += 1
                y -= 1
                x -= 1
        elif idx % 4 == 2:
            maps[y][x] = num
            x -= 1
            if x == -1:
                idx += 1
                y -= 1
                x += 1
            if maps[y][x] != 0:
                idx += 1
                x += 1
                y -= 1
        elif idx % 4 == 3:
            maps[y][x] = num
            y -= 1
            if maps[y][x] != 0:
                idx += 1
                y += 1
                x += 1

                # 종료
        if idx + 1 == rotate[-1]:
            break
        num += 1

    for i in range(N):
        print(*maps[i])

 

 

2. 정답코드

다른 분들의 문제 해결 방안 피드백을 들으니 그래프 탐색으로 해결했다고 해서 본인도 그래프 탐색으로 해결했다.
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    N = int(input())

    dy, dx = (0, 1, 0, -1), (1, 0, -1, 0)
    maps = [[0] * N for _ in range(N)]

    y, x = 0, 0
    num = 1
    idx = 0
    while num <= (N * N):
        maps[y][x] = num

        y += dy[idx]
        x += dx[idx]

        if y < 0 or y >= N or x < 0 or x >= N:
            y -= dy[idx]
            x -= dx[idx]

            idx = (idx + 1) % 4

            y += dy[idx]
            x += dx[idx]
        elif maps[y][x] != 0:
            y -= dy[idx]
            x -= dx[idx]

            idx = (idx + 1) % 4

            y += dy[idx]
            x += dx[idx]

        num += 1

    print(f'#{test_case}')
    for i in range(N):
        print(*maps[i])

'Algorithm > SWEA' 카테고리의 다른 글

[SWEA] D3. 상호의 배틀필드  (1) 2022.11.14
[SWEA] D3. 회문2  (0) 2022.11.11
[SWEA] D3. N-Queen  (0) 2022.11.11
[SWEA] D3. Magnetic  (0) 2022.11.11
[SWEA] D3. 최대 상금  (0) 2022.11.08