Python/Coding Test
[백준] 7562 : 나이트의 이동 (+ 그래프 정리)
semperparatus
2024. 2. 3. 09:41
https://www.acmicpc.net/problem/7562
7562번: 나이트의 이동
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수
www.acmicpc.net
코드
from collections import deque
T = int(input()) # 테스트 케이스 개수
for _ in range(T):
I = int(input()) # 체스판 한 변의 길이
row_now, col_now = map(int, input().split()) # 현재 위치
row_target, col_target = map(int, input().split()) # 타겟 위치
row_rot = [-2, -1, 1, 2, 2, 1, -1, -2] # 나이트 이동 가능한 행 방향
col_rot = [1, 2, 2, 1, -1, -2, -2, -1] # 나이트 이동 가능한 열 방향
chess = [[0] * (I) for _ in range(I)]
dq = deque([[row_now, col_now]])
while dq:
row_tmp, col_tmp = dq.popleft()
if row_tmp == row_target and col_tmp == col_target:
print(chess[row_target][col_target])
break
for k in range(8):
row_move = row_tmp + row_rot[k]
col_move = col_tmp + col_rot[k]
if 0 <= row_move < I and 0 <= col_move < I and not chess[row_move][col_move]:
chess[row_move][col_move] = chess[row_tmp][col_tmp] + 1
dq.append([row_move, col_move])
풀이
이전에 풀어보았던 최단 거리 bfs 유형과 상당히 비슷해서 손쉽게 풀이할 수 있었다. 알고리즘 문제를 유형화하며 풀어가니 문제 해법을 잡아갈 수 있는 것 같다. 특히 그래프 문제에서는 상하좌우 이동과 같은 방향 이동 문제가 자주 출제되는 것 같다고 느꼈다.
해당 문제에선 1) 방향 인덱스 설정 및 for문 통한 방향 이동, 2) 최단 거리 -> bfs 이용, 3) 정지 조건, 4) 이동된 방향 인덱스 조건 확인 (범위 내 + 이미 방문한 인덱스인지 여부) 의 확인이 다른 문제와 동일하게 필요하다.
이 문제와 별개로 그래프 유형 및 주의해야 할 점을 정리하며 해당 글을 마치고자 한다.
1) BFS
- 최단 거리(=최단 시간)의 경우 BFS 사용
- from collections import deque를 통해 덱 자료형 사용
2) DFS
- import sys, sys.setrecursionlimit을 이용해 최대 재귀 깊이 설정 (파이썬 기본 재귀 깊이가 매우 얕기 때문)
3) 인접 행렬, 인접 리스트
- 인접 행렬의 경우 입력 데이터에 크기에 맞는 모든 2차원 메모리 공간을 미리 생성해두어야 하기 때문에 입력이 큰 경우 메모리 제한으로 인한 에러가 발생할 수 있음
- 따라서 이러한 경우 인접 리스트를 활용하는 것이 효율적임
4) 인접 정점 방문 순서
- 주어진 문제에서 인접 정점 방문 순서를 오름차순으로 주었는지, 내림차순으로 주었는지 확인 후 입력받은 데이터 sorting
5) 방향 이동 출제 경향 ↑
- 일직선, 상하좌우, 2차원 n방향 이동 문제가 자주 출제
- 코드의 가독성 및 헷갈림 방지를 위해 row, col과 같은 명확한 변수 설정하기