티스토리 뷰
https://www.acmicpc.net/problem/8972
🐢 설명
내가 조종하는 아두이노 기기 [I]와 미친 아두이노 [R] 들이 만나지 않고 주어진 명령을 수행하는지 확인하는 문제이다.
또한, 주어진 8방향은 순서가 정해져있으므로 그에 맞춰서 dir 배열을 만들어야 한다.
나의 아두이노가 실패하는 경우
- 내가 이동할 때 미친 아두이노를 만난 경우
- 미친 아두이노가 나에게 가깝게 이동하는데 만난 경우
내가 성공하는 경우
- 주어진 명령 방향을 온전히 수행하는 경우
주어진 명령이 맵을 벗어나는 경우가 없어서 맘편히 돌리면 되어서 좀 편했다.
일단 모든 미친 아두이노를 리스트에 담고 지도에 -1로 표시해주었다.
이 후 나의 아두이노가 주어진 명령 하나를 수행하고, 모든 미친 아두이노들에 대해서 8방향 중 나의 아두이노와 가장 가까운 방향을 구한 후 해당 방향으로 이동시켜주었다.
- 이미 미친 아두이도가 있다면 -1을 더해줘서 중복으로 존재한다는 것을 표시해줬다.
- 나의 아두이노가 있다면 종료하도록 했다.
모든 미친 아두이노에 대해서 이동이 끝난 후 지도에 2개 이상의 아두이노가 존재한다면(-1보다 작은 경우), 전부 지우고 남아있는 아두이노만 다시 담아주었다.
🐢코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static int[][] Map = new int[100][100];
static int[] dy = {1, 1, 1, 0, 0, 0, -1, -1, -1};
static int[] dx = {-1, 0, 1, -1, 0, 1, -1, 0, 1};
static int N, M, moveCnt;
static Dot I = new Dot(0, 0);
static ArrayList<Dot> crazyArduinos = new ArrayList<>();
private static class Dot {
int y, x;
public Dot(int y, int x) {
this.y = y;
this.x = x;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder answer = new StringBuilder();
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
String s = br.readLine();
for (int j = 0; j < M; j++) {
if (s.charAt(j) == 'R') {
crazyArduinos.add(new Dot(i, j));
Map[i][j] = -1;
}
if (s.charAt(j) == 'I') I = new Dot(i, j);
}
}
String moveOrder = br.readLine();
if (!play(moveOrder)) answer.append("kraj ").append(moveCnt);
else {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (Map[i][j] == -1) answer.append("R");
else if (i == I.y && j == I.x) answer.append("I");
else answer.append(".");
}
answer.append("\n");
}
}
System.out.print(answer);
}
private static boolean play(String moveOrder) {
for (int i = 0; i < moveOrder.length(); i++) {
moveCnt = i + 1;
int dir = (moveOrder.charAt(i) - '0') - 1;
I.y += dy[dir];
I.x += dx[dir];
if (Map[I.y][I.x] == -1) return false;
if (!meetCrazyArduino()) return false;
}
return true;
}
private static boolean meetCrazyArduino() {
int iY = I.y;
int iX = I.x;
for (Dot arduino : crazyArduinos) {
Map[arduino.y][arduino.x] += 1;
int Min = 1000;
int dir = 0;
int dist;
for (int d = 0; d < 9; d++) {
dist = Math.abs(iY - (arduino.y + dy[d])) + Math.abs(iX - (arduino.x + dx[d]));
Min = Math.min(dist, Min);
if (dist == Min) dir = d;
}
arduino.y += dy[dir];
arduino.x += dx[dir];
Map[arduino.y][arduino.x] -= 1;
if (arduino.y == iY && arduino.x == iX) return false;
}
crazyArduinos.clear();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (Map[i][j] < -1) Map[i][j] = 0;
else if (Map[i][j] == -1) crazyArduinos.add(new Dot(i, j));
}
}
return true;
}
}
반응형
'알고리즘 > 백준' 카테고리의 다른 글
(백준) 최소 환승 경로 - 2021 [java] (0) | 2021.08.18 |
---|---|
(백준) 달이 차오른다, 가자 - 1194 [java] (0) | 2021.08.17 |
(백준) 단어암기 - 18119 [java] (0) | 2021.08.09 |
(백준) 20437 - 문자열 게임 2 [java] (0) | 2021.08.09 |
(백준) 다리만들기2 - 17472 [java] (0) | 2021.08.05 |
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday