Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- ESP-01
- 아두이노 우노
- 백준풀이
- CSS
- dp문제
- ESP8266
- ESP8266WiFi
- scroll-snap
- C
- @supports
- 백준15988풀이
- 2193
- reactNative
- 백준 #백준2661 #좋은수열 #Java #코딩
- 리액트네이티브
- aspect-ratio
- peap
- 백준문제풀이 #백준 #백준문제 #스타트택시
- Flexible box
- 연결리스트
- scss
- 이친수문제
- 백준자바
- 노마드코더
- 백준java
- 프로젝트초기설정
- 백준
- 포인터
- ESP-01WiFi
- CSS Flex
Archives
- Today
- Total
코딩 농장
[백준 7562번/JAVA] 나이트의 이동 (문제 풀이, 코드) 본문
728x90
나이트의 이동
[문제]
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
[풀이]
전형적인 그래프 탐색 알고리즘을 이용하는 것이다.
단, 너비우선탐색(bfs)를 써야한다. 최소 횟수니까 bfs는 먼저 도착한 놈이 최소 횟수를 만족한다.
[내 코드 알고리즘]
Queue를 만들어서 현재 위치를 넣는다.
Queue에서 item 하나를 꺼내온다. 해당 item이 갈 수 있는 위치를 큐에 다 넣는다.큐가 빌 때 까지 반복하고, Queue에서 꺼낸 item이 목표 위치면 그만한다.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
class xy {
int x;
int y;
int cnt;
xy(int x, int y, int cnt) {
this.x = x;
this.y = y;
this.cnt = cnt;
}
}
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
int ans;
for(int i=0; i<T; i++) {
ans=0;
Queue<xy> bfs = new LinkedList<>();
int N = Integer.parseInt(br.readLine()); // 체스판 크기
st = new StringTokenizer(br.readLine(), " ");
int visited[][] = new int[N][N];
xy now = new xy(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), 0);
st = new StringTokenizer(br.readLine(), " ");
xy to = new xy(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), 0);
/* bfs */
bfs.add(now);
while(!bfs.isEmpty()) {
xy pos = bfs.poll();
if(visited[pos.x][pos.y] ==1 ) continue;
if(pos.x == to.x && pos.y == to.y) {
ans = pos.cnt;
break;
}
visited[pos.x][pos.y]= 1;
int right = pos.x+1;
int right_2 = pos.x+2;
int left = pos.x-1;
int left_2 = pos.x-2;
int up = pos.y+1;
int up_2 = pos.y+2;
int down = pos.y-1;
int down_2 = pos.y-2;
int c = pos.cnt+1;
if(right<N && up_2<N && visited[right][up_2] == 0)
bfs.add(new xy(right, up_2, c));
if(right_2<N && up<N && visited[right_2][up] == 0)
bfs.add(new xy(right_2, up, c));
if(right<N && down_2>=0 && visited[right][down_2] == 0)
bfs.add(new xy(right, down_2, c));
if(right_2<N && down>=0 && visited[right_2][down] == 0)
bfs.add(new xy(right_2, down, c));
if(left>=0 && down_2>=0 && visited[left][down_2] == 0)
bfs.add(new xy(left, down_2, c));
if(left_2>=0 && down>=0 && visited[left_2][down] == 0)
bfs.add(new xy(left_2, down, c));
if(left>=0 && up_2<N && visited[left][up_2] == 0)
bfs.add(new xy(left, up_2, c));
if(left_2>=0 && up<N && visited[left_2][up] == 0)
bfs.add(new xy(left_2, up, c));
}
System.out.println(ans);
}
}
}
[개선]
if문의 반복으로 코드가 더러워(?)보인다.
반복문으로 개선할 여지가 있다.
GitHub에 티스토리에 올리지 않은 코드들도 업로드 되어 있습니다.
https://github.com/MOBUMIN/BJalgorithm/blob/master/07000-07999/chess_7562.java
MOBUMIN/BJalgorithm
백준 알고리즘 푼 것. Contribute to MOBUMIN/BJalgorithm development by creating an account on GitHub.
github.com
'백준' 카테고리의 다른 글
[백준 16928번/JAVA] 뱀과 사다리 게임 (문제 풀이, 코드) (0) | 2021.07.16 |
---|---|
[백준 6588번/JAVA] 골드바흐의 추측 (문제 풀이, 코드) (0) | 2021.07.11 |
[백준 1012번/JAVA] 유기농배추 (문제 풀이, 코드) (0) | 2021.07.05 |
[백준 9613번/JAVA] GCD 합 (문제 풀이, 코드) (0) | 2021.07.05 |
[백준 1065번/JAVA] 한수 (문제 풀이, 코드) (0) | 2021.06.25 |
Comments