1. 문제 링크
1726번: 로봇
많은 공장에서 로봇이 이용되고 있다. 우리 월드 공장의 로봇은 바라보는 방향으로 궤도를 따라 움직이며, 움직이는 방향은 동, 서, 남, 북 가운데 하나이다. 로봇의 이동을 제어하는 명령어는
www.acmicpc.net
2. 문제 및 입출력예제
3. 문제 풀이
1. BFS 탐색을 통해 도착점에 원하는 방향으로 도착하면 끝낸다.
2. Go 1,2,3 을 이용한 1번 명령을 진행하여 이동 위치를 가지고 판단한다.
2-1. 이동 위치가 공장 내에 위치하는지 확인한다.
2-2. 이동 위치에 궤도가 깔려 있는지 확인한다.
2-3. 이동 위치를 방문한 적이 있는지 확인한다.
3. Turn left, right를 이용해 90도 회전한다.
3-1. 동/서 => 남/북, 남/북 => 동/서를 이용해 방문하지 않았던 곳을 Queue에 넣는다.
주의해야할 부분
1. 동서남북 순서
2. 배열 (1, 1) ~ (N, M)
3. 이동이 가능한 벽인지, 방문했던 벽인지 여부
4. 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
public class Main {
static class Point {
int x;
int y;
int d;
int cnt;
public Point(int x, int y, int d, int cnt) {
this.x = x;
this.y = y;
this.d = d;
this.cnt = cnt;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 동 서 남 북 => 이거 입력 순서 주의
int[] dx = { 0, 0, 1, -1 };
int[] dy = { 1, -1, 0, 0 };
String[] split = br.readLine().split(" ");
int N = Integer.parseInt(split[0]);
int M = Integer.parseInt(split[1]);
boolean[][] map = new boolean[N][M];
for (int i = 0; i < N; i++) {
split = br.readLine().split(" ");
for (int j = 0; j < M; j++) {
if(split[j].equals("0")) {
map[i][j] = true;
}
else {
map[i][j] = false;
}
}
}
split = br.readLine().split(" ");
int x = Integer.parseInt(split[0])-1;
int y = Integer.parseInt(split[1])-1;
int d = Integer.parseInt(split[2])-1;
Point start = new Point(x, y, d, 0);
split = br.readLine().split(" ");
x = Integer.parseInt(split[0])-1;
y = Integer.parseInt(split[1])-1;
d = Integer.parseInt(split[2])-1;
Point end = new Point(x, y, d, 0);
Queue<Point> q = new ArrayDeque<>();
boolean[][][] visit = new boolean[N][M][4];
q.offer(start);
visit[start.x][start.y][start.d] = true;
int cnt = 0;
out: while (!q.isEmpty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
Point now = q.poll();
x = now.x;
y = now.y;
d = now.d;
cnt = now.cnt;
if (x == end.x && y == end.y && d == end.d) {
break out;
}
// 명령 1번
for (int dist = 1; dist < 4; dist++) {
int X = dx[d] * dist + x;
int Y = dy[d] * dist + y;
if (X < 0 || X >= N || Y < 0 || Y >= M || !map[X][Y]) {
break;
}
if(!visit[X][Y][d]) { //방문은 따로 해줘야 함
q.offer(new Point(X, Y, d, cnt + 1));
visit[X][Y][d] = true;
}
}
// 명령 2번
int one = 0;
int two = 0;
if (d == 0 || d == 1) { // 동서
one = 2;
two = 3;
}
else { // 남북
one = 0;
two = 1;
}
if (!visit[x][y][one]) {
q.offer(new Point(x, y, one, cnt + 1));
visit[x][y][one] = true;
}
if (!visit[x][y][two]) {
q.offer(new Point(x, y, two, cnt + 1));
visit[x][y][two] = true;
}
}
}
System.out.println(cnt);
}
}
'ALGORITHM' 카테고리의 다른 글
백준 2448 별 찍기 - 11 (Java) (0) | 2023.09.07 |
---|---|
백준 1744 수 묶기 (Java) (0) | 2023.09.06 |
백준 1749 점수따먹기 (Java) (0) | 2023.09.04 |
백준 1238 파티 (Java) (0) | 2023.09.03 |
백준 12904 A와 B (Java) (0) | 2023.09.02 |