알고리즘 문제풀이

Swea D2_1954 달팽이 Python

아크몽 2024. 2. 15. 00:32
dr = [0,1,0,-1]
dc = [1,0,-1,0]
T = int(input())
for tc in range(1,T+1):
    N = int(input())
    arr = [[0]* N for _ in range(N)]
    # print(arr)

    r,c = 0,-1 #초기위치
    dist = 0 # 회전방향
    i = 1
    while i <= N*N:
        nr, nc = r + dr[dist], c + dc[dist]
        # 4방향 탐색 == 벽 체크
        if 0<= nr < N and 0 <= nc < N and arr[nr][nc] == 0:
            arr[nr][nc] = i
            i += 1 # 숫자 증가
            r, c = nr, nc
        # 벽에 부딪쳤다 or 도착한 곳이 0이 아니다
        else:
            dist = (dist + 1) % 4 # +1 씩 더해가다가 5이상 넘어가면 안되기 때문
    print(f'#{tc}')
    for x in arr:
        print(*x)

실수 한 것

1. 4 방향 탐색 문제임을 모르고 그리디 하게 풀려했음

if i == 0:
    for j in range(N):
        arr[i][j] += 1 + j
    elif j == N-1:
        arr[i][j] += N + i # [1,2] [2,2]
    elif i == N-1:
        arr[i][j] += i*N+1 - j # [2,1] [2,0]

2. 반복문 for을 사용해서 풀려고 했음. 하지만 벽체크와 별개로 인덱스는 계속 올라갔기 때문에 N*N을 다 돌았을 때 모든 칸을 돌게 되는것이 아니었음

for i in range(1,N*N+1):
        nr, nc = r + dr[dist], c + dc[dist]
        # 4방향 탐색 == 벽 체크
        if 0<= nr < N and 0 <= nc < N and arr[nr][nc] == 0:
            arr[r][c] = i
            r, c = nr, nc
        # 벽에 부딪쳤다 or 도착한 곳이 0이 아니다
        else:
            dist = (dist + 1) % 4 # +1 씩 더해가다가 5이상 넘어가면 안되기 때문

3. 벽체크 할 때 nr, nc 로 구해놓고 arr[r][c] 으로 설정했음

4. arr[nr][nc] 으로 바꾸고 나서 c의 값을 -1로 설정할 필요가 있었음
이동하고 나서 안에 숫자를 채우기 때문

r,c = 0,0

while i <= N*N:    
    if 0<= nr < N and 0 <= nc < N and arr[nr][nc] == 0:
        arr[r][c] = i