티스토리 뷰
1. 문제
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
입)
입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.
출)
각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.
2. 풀이
import java.util.*;
public class Main {
// 8 방향을 확인해야 함.
static final int[] dx = {-2, -1, 1, 2, 2, 1, -1, -2};
static final int[] dy = {1, 2, 2, 1, -1, -2, -2, -1};
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
// 테스트 케이스
int t = sc.nextInt();
while (t-- > 0) {
// 체스판 크기
int n = sc.nextInt();
// 시작점 X
int sx = sc.nextInt();
// 시작점 Y
int sy = sc.nextInt();
// 목표점 X
int ex = sc.nextInt();
// 목표점 Y
int ey = sc.nextInt();
// 크기만큼 배열 생성
int[][] d = new int[n][n];
// -1로 초기화
for (int i=0; i<n; i++) {
Arrays.fill(d[i],-1);
}
Queue<Integer> q = new LinkedList<>();
q.add(sx);
q.add(sy);
// 초기값
d[sx][sy] = 0;
// 큐가 EMPTY될 때까지
while (!q.isEmpty()) {
int x = q.remove();
int y = q.remove();
// 8방향 확인하면서
for (int k = 0; k < 8; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (0 <= nx && nx < n && 0 <= ny && ny < n) {
// 방문 안한 경우
if (d[nx][ny] == -1) {
d[nx][ny] = d[x][y] + 1;
q.add(nx);
q.add(ny);
}
}
}
}
System.out.println(d[ex][ey]);
}
}
}
BFS 활용해서 처리함.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- blocking
- 프로그래머스 Level 1
- 프로그래머스 Level 3
- Filter
- Asynchronous
- 블로킹
- non-blocking
- 스택/큐
- 해시
- 논블로킹
- 비동기
- Handler Interceptor
- 프로그래머스 Level 2
- 필터
- Synchronous
- 동기
- http://www.nextree.co.kr/p6960/
- 인터셉터
- a
- 프로그래머스
- 핸들러 인터셉터
- 코딩테스트 고득점 Kit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함