티스토리 뷰

https://www.acmicpc.net/problem/8972

 

🐢 설명

내가 조종하는 아두이노 기기 [I]와 미친 아두이노 [R] 들이 만나지 않고 주어진 명령을 수행하는지 확인하는 문제이다.

또한, 주어진 8방향은 순서가 정해져있으므로 그에 맞춰서 dir 배열을 만들어야 한다.

 

나의 아두이노가 실패하는 경우

  1. 내가 이동할 때 미친 아두이노를 만난 경우
  2. 미친 아두이노가 나에게 가깝게 이동하는데 만난 경우

내가 성공하는 경우

  1. 주어진 명령 방향을 온전히 수행하는 경우

주어진 명령이 맵을 벗어나는 경우가 없어서 맘편히 돌리면 되어서 좀 편했다.

 


일단 모든 미친 아두이노를 리스트에 담고 지도에 -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;
    }
}
반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday