ํ•ด๋ฒ„๋‹ˆ 2023. 11. 26. 11:49
๋ฐ˜์‘ํ˜•

 

 

๋ฌธ์ œ

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

 

2174๋ฒˆ: ๋กœ๋ด‡ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ A, B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์ค„์—๋Š” ๋‘ ์ •์ˆ˜ N, M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ๋กœ๋ด‡์˜ ์ดˆ๊ธฐ ์œ„์น˜(x, y์ขŒํ‘œ ์ˆœ) ๋ฐ ๋ฐฉํ–ฅ์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ๋ช…๋ น์ด ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ์ˆœ

www.acmicpc.net

 

 

 

 

 

 

์—„์ฒญ ์–ด๋ ต์ง„ ์•Š์€ ๊ตฌํ˜„๋ฌธ์ œ๋ฅผ ์ง์ง€์—๊ฒŒ ์†Œ๊ฐœ๋ฐ›์•„ ํ’€๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

 

 

 

 

 

 

ํ’€์ด

์ง€๋„(์ด์ฐจ์› ๋ฐฐ์—ด)์— ๋กœ๋ด‡์ด ์žˆ๋Š” ์œ„์น˜๋ฅผ 1 ์—†๋Š” ์œ„์น˜๋ฅผ 0์œผ๋กœ ์žก๊ณ , 1์ด๋ผ๋ฉด ๋กœ๋ด‡์˜ num์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋กœ์ง์„ ์งฐ๋‹ค.

ํ•˜์ง€๋งŒ 1๊ณผ 0์œผ๋กœ ํ•˜์ง€ ์•Š๊ณ , 0๊ณผ ๋กœ๋ด‡๋„˜๋ฒ„ ์ˆซ์ž๋“ค๋กœ ๋„ฃ์—ˆ๋‹ค๋ฉด ๋กœ๋ด‡์˜ num์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋กœ์ง์„ ์งœ์ง€ ์•Š์•„๋„ ๋˜์ง€ ์•Š์•˜์„๊นŒ? ๋” ๊ฐ„๋‹จํ•ด์ง€์ง€ ์•Š์•˜์„๊นŒ? ํ•˜๋Š” ์•„์‰ฌ์›€์ด ์žˆ์—ˆ๋‹ค. 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class Main {
    public static Set<Robot> robot = new HashSet<>();

    public static class Robot {
        int num;
        int x;
        int y;
        String way;

        public Robot(int num, int x, int y, String way) {
            super();
            this.num = num;
            this.x = x;
            this.y = y;
            this.way = way;
        }
    }

    /**
     * ๋ฐ˜ํ™˜๊ฐ’์ด 0์ด๋ฉด OK, 1์ด์ƒ์ด๋ฉด ์ถฉ๋Œ, 1 ์ด์ƒ์€ ๋กœ๋ด‡์˜ ๋ฒˆํ˜ธ์ž„
     * 
     * @param robotNum
     * @param way
     * @param length
     * @return
     */
    public static int[] move(int robotNum, String way, int length, int[][] field) {
        Robot targetRobot = findRobotByNum(robotNum);
        int[] answer = new int[2]; // 0 : ์ถฉ๋Œํ•œ ๋กœ๋ด‡์˜ ๋„˜๋ฒ„, 1: ์ถฉ๋Œ๋‹นํ•œ ๋กœ๋ด‡์˜ ๋„˜๋ฒ„

        if (targetRobot != null) {
            int x = targetRobot.x;
            int y = targetRobot.y;

            // way๊ฐ€ F๋ฉด ์ด๋™, ๋‹ค๋ฅธ๊ฑฐ๋ฉด ํšŒ์ „์ž„
            if (way.equals("F")) {
                switch (targetRobot.way) {
                    case "N": // y ++
                        // ๋‹ค๋ฅธ ๋กœ๋ด‡๊ณผ ๋ถ€๋”ชํžˆ๋Š”์ง€
                        for (int i = 0; i < length; i++) {
                            field[x][y] = 0;
                            // ๋ฒฝ์— ๋ถ€๋”ชํžˆ๋Š”์ง€
                            if (field[0].length <= (y + 1)) {
                                answer[0] = targetRobot.num;
                                return answer;
                            }

                            if (field[x][y + 1] == 1) {
                                Robot crushedRobot = findCrushedRobotByNum(x, (y + 1));
                                if (crushedRobot != null) {
                                    answer[0] = targetRobot.num;
                                    answer[1] = crushedRobot.num;
                                }

                                return answer;
                            } else {
                                field[x][y + 1] = 1;
                                y++;
                                targetRobot.y++;
                            }
                        }
                        break;
                    case "W": // x --
                        // ๋‹ค๋ฅธ ๋กœ๋ด‡๊ณผ ๋ถ€๋”ชํžˆ๋Š”์ง€
                        for (int i = 0; i < length; i++) {
                            field[x][y] = 0;
                            // ๋ฒฝ์— ๋ถ€๋”ชํžˆ๋Š”์ง€
                            if ((x - 1) < 0) {
                                answer[0] = targetRobot.num;
                                return answer;
                            }

                            if (field[x - 1][y] == 1) {
                                Robot crushedRobot = findCrushedRobotByNum((x - 1), y);
                                if (crushedRobot != null) {
                                    answer[0] = targetRobot.num;
                                    answer[1] = crushedRobot.num;
                                }
                                return answer;
                            } else {
                                field[x - 1][y] = 1;
                                x--;
                                targetRobot.x--;
                            }
                        }
                        break;
                    case "E": // x ++
                        // ๋‹ค๋ฅธ ๋กœ๋ด‡๊ณผ ๋ถ€๋”ชํžˆ๋Š”์ง€
                        for (int i = 0; i < length; i++) {
                            field[x][y] = 0;
                            // ๋ฒฝ์— ๋ถ€๋”ชํžˆ๋Š”์ง€
                            if (field.length <= (x + 1)) {
                                answer[0] = targetRobot.num;
                                return answer;
                            }

                            if (field[x + 1][y] == 1) {
                                Robot crushedRobot = findCrushedRobotByNum((x + 1), y);
                                if (crushedRobot != null) {
                                    answer[0] = targetRobot.num;
                                    answer[1] = crushedRobot.num;
                                }
                                return answer;
                            } else {
                                field[x + 1][y] = 1;
                                x++;
                                targetRobot.x++;
                            }
                        }
                        break;
                    case "S": // y--
                        // ๋‹ค๋ฅธ ๋กœ๋ด‡๊ณผ ๋ถ€๋”ชํžˆ๋Š”์ง€
                        for (int i = 0; i < length; i++) {
                            field[x][y] = 0;
                            // ๋ฒฝ์— ๋ถ€๋”ชํžˆ๋Š”์ง€
                            if ((y - 1) < 0) {
                                answer[0] = targetRobot.num;
                                return answer;
                            }

                            if (field[x][y - 1] == 1) {
                                Robot crushedRobot = findCrushedRobotByNum(x, (y - 1));
                                if (crushedRobot != null) {
                                    answer[0] = targetRobot.num;
                                    answer[1] = crushedRobot.num;
                                }
                                return answer;
                            } else {
                                field[x][y - 1] = 1;
                                y--;
                                targetRobot.y--;
                            }
                        }
                        break;
                }
                // System.out.println("์ด๋™ํ•œ ์œ„์น˜ : x :" + x + " y :" + y);
            } else {
                for (int i = 0; i < length % 4; i++) {
                    String currentWay2 = targetRobot.way;
                    String findWayValue = findWay(currentWay2, way);
                    if (!findWayValue.equals("")) {
                        targetRobot.way = findWayValue;
                    }
                    // System.out.println(targetRobot.way);
                }
            }

        }

        return answer;
    }

    /**
     * num์œผ๋กœ ๋กœ๋ด‡ ์ฐพ๊ธฐ
     * 
     * @param num
     * @return
     */
    public static Robot findRobotByNum(int num) {
        for (Robot r : robot) {
            if (r.num == num) {
                return r;
            }
        }
        return null;
    }

    /**
     * ์ขŒํ‘œ๋กœ ๋กœ๋ด‡ ์ฐพ๊ธฐ
     * 
     * @param x
     * @param y
     * @return
     */
    public static Robot findCrushedRobotByNum(int x, int y) {
        for (Robot r : robot) {
            if (r.x == x && r.y == y) {
                return r;
            }
        }
        return null;
    }


    /**
     * ๋ฐฉํ–ฅ ์ •ํ•˜๊ธฐ
     * 
     * @param currentWay
     * @param changeWay
     * @return
     */
    public static String findWay(String currentWay, String changeWay) {
        switch (currentWay) {
            case "N":
                switch (changeWay) {
                    case "L":
                        return "W";
                    case "R":
                        return "E";
                }
                break;
            case "W":
                switch (changeWay) {
                    case "L":
                        return "S";
                    case "R":
                        return "N";
                }
                break;
            case "E":
                switch (changeWay) {
                    case "L":
                        return "N";
                    case "R":
                        return "S";
                }
                break;
            case "S":
                switch (changeWay) {
                    case "L":
                        return "E";
                    case "R":
                        return "W";
                }
                break;
        }
        return "";
    }


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        int[][] field = new int[a][b];

        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        for (int i = 1; i <= n; i++) {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            String way = st.nextToken();
            field[x - 1][y - 1] = 1;
            Robot r = new Robot(i, (x - 1), (y - 1), way);
            robot.add(r); // ๋กœ๋ด‡์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ถ”๊ฐ€
        }


        int[] answer = new int[2];
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int robotNum = Integer.parseInt(st.nextToken());
            String way = st.nextToken();
            int length = Integer.parseInt(st.nextToken());

            answer = move(robotNum, way, length, field);

            if (answer[0] != 0 && answer[1] == 0) {
                bw.write("Robot " + String.valueOf(answer[0]) + " crashes into the wall\n");
                break;
            } else if (answer[1] != 0) {
                bw.write("Robot " + String.valueOf(answer[0]) + " crashes into robot " + String.valueOf(answer[1]) + "\n");
                break;
            }

        }
           
        if (answer[0] == 0 && answer[1] == 0) {
            bw.write("OK\n");
        }


        bw.flush();
        bw.close();
    }
}

์•„์›… ๊ธธ๋‹ค ๊ธธ์–ด

 

 

 

 

 

 

 

 

 

์•”ํŠผ ์ฝ”๋“œ ๊ตฌํ˜„์„ ํ•˜๊ณ  ์˜ˆ์ œ ์ž…๋ ฅ๋„ ์•Œ๋งž๊ฒŒ ์ถœ๋ ฅ์ด ๋ผ์„œ ์ œ์ถœ์„ ํ–ˆ๋Š”๋ฐ, ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๋ผ๊ณ  ๋–ด๋‹ค.

์ด๋Ÿด๋•Œ ํ™”๋‚˜์ฃ ,, ์–ด๋””๊ฐ€ ์–ด๋–ป๊ฒŒ ํ‹€๋ ธ๋Š”์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ,,

 

ํ•˜์ง€๋งŒ ๊ด‘๊ธฐ์–ด๋ฆฐ ๋ถ„๊ป˜์„œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋งŽ์ด ์˜ฌ๋ ค์ฃผ์‹  ๋•๋ถ„์— ๋ฐ‘ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ํ‹€๋ฆฐ ๋ถ€๋ถ„์„ ๋ฐ”๋กœ์žก์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

29 44
52 10
28 29 E
25 31 S
22 31 N
5 2 E
16 28 E
19 2 W
5 4 S
22 38 S
6 37 E
2 25 N
17 19 N
4 6 S
8 25 N
13 22 N
4 11 N
5 39 S
18 34 S
17 1 W
11 17 N
14 34 W
13 31 W
26 1 S
12 38 E
14 21 W
2 2 S
23 20 S
24 14 S
5 29 E
2 10 W
26 24 W
24 34 N
17 38 E
17 29 N
20 26 S
10 7 N
19 8 N
27 7 W
5 5 W
4 39 S
27 32 S
25 12 S
28 25 S
18 31 W
15 41 S
20 20 E
6 22 W
9 12 W
24 2 E
19 32 N
23 34 S
17 11 W
6 4 S
46 L 2
43 F 4
47 F 2
33 F 5
36 L 11
3 L 2
45 L 2
40 F 5
33 F 10
45 F 6
27 37
46 100
20 22 S
26 3 N
22 28 S
17 16 W
15 18 N
11 17 S
7 15 W
17 2 E
7 16 W
13 14 S
11 27 N
21 23 S
11 12 E
22 11 S
19 11 E
22 1 S
8 16 S
21 18 S
2 20 W
16 6 S
5 22 N
3 15 S
2 29 W
14 23 S
19 9 W
12 30 N
3 28 N
23 33 S
25 24 N
6 4 S
12 6 N
1 14 N
24 1 E
8 21 W
23 22 W
10 21 N
17 31 S
7 11 S
13 7 E
6 27 S
3 6 W
12 35 E
23 16 E
5 29 W
20 23 S
1 22 E
3 L 2
25 R 25
33 R 5
24 F 9
25 F 2
15 F 2
46 L 4
46 L 13
45 L 14
26 F 4
4 F 5
42 F 1
39 R 3
24 L 2
6 F 2
46 F 5
12 F 8
6 F 3
9 F 5
36 F 5
38 R 2
35 L 30
38 F 7
2 R 6
46 L 3
21 R 2
44 F 1
36 F 2
23 F 1
40 R 30
11 F 3
20 L 6
10 F 6
10 R 20
11 F 1
35 L 29
27 F 8
3 L 24
14 L 6
32 F 10
40 F 8
26 R 3
12 F 5
10 L 19
10 L 2
36 R 2
27 F 1
21 L 2
39 F 1
17 F 7
46 L 25
2 L 13
5 R 2
2 R 18
22 F 9
45 L 18
16 F 6
5 F 9
34 F 1
5 L 2
21 F 6
36 L 26
41 F 6
2 F 1
5 F 8
38 F 5
35 F 9
15 R 2
31 F 2
37 L 2
44 F 2
46 F 1
40 F 1
42 F 4
12 F 9
22 F 2
7 R 2
9 R 24
17 F 6
15 R 2
34 F 5
46 F 6
29 R 2
9 F 10
34 R 11
15 L 10
16 F 7
8 R 22
1 F 8
38 F 3
41 F 5
22 L 7
45 R 2
2 F 5
20 F 3
24 L 1
32 L 2
43 F 6
38 F 2
32 F 6
# Robot 33 crashes into robot 32

 

 

 

 

 

 

 

 

 

 

์ •๋‹ต 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•