알고리즘 문제풀이
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