728x90
n이 홀수인 경우 그리고 n*n인 2차원 배열인 경우에만 사용할 수 있는 코드 일듯하다.
달팽이가 벽에 부딪히거나 방향을 바꿔야 하는 경우 바뀔 방향은 고정적이라는 특성을 활용했다.
import copy
n = int(input())
arr = [[0 for _ in range(n)] for _ in range(n)]
dx = [0,-1,1,0,0]
dy = [0,0,0,-1,1]
check_arr = copy.deepcopy(arr)
check_arr[0][0] = 1
move_path_back=[[0,0,2]]
move_path_start=[[n//2,n//2,1]]
while True:
before = move_path_back[-1]
way = before[2]
curr = [before[0]+dx[way], before[1]+dy[way],way]
if curr[0] == n//2 and curr[1] == n//2:
break
if curr[0] < 0 or curr[0] >= n or curr[1] < 0 or curr[1] >= n or check_arr[curr[0]][curr[1]] == 1: #before의 방향을 수정해줘야함
if way == 1: #to left 3
move_path_back[-1][2] = 3
if way == 2: #to right 4
move_path_back[-1][2] = 4
if way == 3: #to under 2
move_path_back[-1][2] = 2
if way == 4: # to up 1
move_path_back[-1][2] = 1
continue
else:
move_path_back.append(curr)
check_arr[curr[0]][curr[1]] = 1
for i in range(len(move_path_back)-1,0,-1):
curr = move_path_back[i].copy()
next = move_path_back[i-1]
if curr[0] > next[0]:
curr[2] = 1
if curr[0] < next[0]:
curr[2] = 2
if curr[1] > next[1]:
curr[2] = 3
if curr[1] < next[1]:
curr[2] = 4
move_path_start.append(curr)
move_path_start += move_path_back
for path in move_path_start:
if path[2] == 1:
arr[path[0]][path[1]] = '상'
if path[2] == 2:
arr[path[0]][path[1]] = '하'
if path[2] == 3:
arr[path[0]][path[1]] = '좌'
if path[2] == 4:
arr[path[0]][path[1]] = '우'
for a in arr:
print(a)
print("==========================")
print()
위와 같이 정 중앙에서 시작해 [0,0]에 도달하면 다시 돌아오는 과정을 거치는 코드다. 시작이 정중앙이다 보니 중앙에서부터 길을 구하려고 하니 생각할 부분이 너무 많았다.
그래서 그냥 돌아오는 길부터 먼저 구하고 그 길을 이용해서 시작하는 길을 구했다.
728x90
'IT 일기 > 코테' 카테고리의 다른 글
17070 / 파이프 옮기기 1 파이썬 (0) | 2023.04.07 |
---|---|
16637번 / 괄호 추가하기 - 파이썬 (0) | 2023.04.06 |
배열 돌리기 4 - 파이썬 (0) | 2023.04.06 |
마법사 상어와 비바라기 - 파이썬 (0) | 2023.04.05 |
임의의 요소의 값보다 요소의 값이 다 작은 경우가 한번이라도 있다면? (0) | 2023.03.27 |