AngelPlayer`s Diary

링크

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

 

2174번: 로봇 시뮬레이션

첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순

www.acmicpc.net

 

 

 

 

문제 해석

로봇의 초기 위치 : x, y
x좌표는 왼쪽부터, y좌표는 아래쪽부터
-> y 좌표가 일반적인 방향과 반대임
-> x y과 프로그래밍적 상식과 반대임

로봇은 방향을 가짐
로봇의 개수는 여러 개
로봇에 M개의 명령을 내림

로봇에게 내릴 수 있는 명령
L : 왼쪽으로 90도 회전
R : 오른쪽으로 90도 회전
F : 향하고 있는 방향으로 한 칸 이동


- 입력
첫 번째 줄 : A B
  A : 가로 길이
  B : 세로 길이


두 번째 줄 : N M
  N : 로봇의 개수
  M : 로봇에 내릴 명령


N개 줄 : x y r
  x : 가로 위치
  y : 세로 위치
  r : 로봇의 초기 회전


M개 줄 : robot order repeat

  robot : 움직일 로봇

  order : 명령

  repeat : 반복 횟수

 


- 출력
문제가 없으면 OK 출력


문제가 발생하면 가장 먼저 발생하는 문제를 출력 후 종료
Robot X crashes into the wall
  X번 로봇이 벽에 충돌하는 경우이다. 즉, 주어진 땅의 밖으로 벗어나는 경우가 된다.
Robot X crashes into robot Y
  X번 로봇이 움직이다가 Y번 로봇에 충돌하는 경우이다.

 

 

 

 

풀이 & 코드 해석

일반적인 구현(시뮬레이션) 문제입니다.

 

처음 문제를 접하면 꽤나 심플해서 할만해 보이는데,

배열을 사용한다면 세로 가로 순서가 반대로 입력되고, 특히 세로의 경우 아래에서 위로 증가하기 때문에 헷갈리지 않도록 하는 것이 중요합니다.

 

 

 

코드

import java.io.*;
import java.util.*;

public class Main {

    static int[] dr = {-1, 0, 1, 0};
    static int[] dc = {0, 1, 0, -1};

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        // 첫 번째 줄
        st = new StringTokenizer(br.readLine());
        int A = Integer.parseInt(st.nextToken()); // 가로 길이
        int B = Integer.parseInt(st.nextToken()); // 세로 길이

        int[][] map = new int[B + 1][A + 1];

        // 두 번째 줄
        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken()); // 로봇의 개수
        int M = Integer.parseInt(st.nextToken()); // 로봇에게 내릴 명령

        int[] r = new int[N + 1];
        int[] c = new int[N + 1];
        int[] rot = new int[N + 1];

        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 fr = st.nextToken();

            y = B - y + 1;

            map[y][x] = i;
            r[i] = y;
            c[i] = x;

            if (fr.equals("N")) {
                rot[i] = 0;
            } else if (fr.equals("E")) {
                rot[i] = 1;
            } else if (fr.equals("S")) {
                rot[i] = 2;
            } else if (fr.equals("W")) {
                rot[i] = 3;
            }
        }
        // print(map);

        // 명령만큼 반복
        L:for (int i = 1; i <= M; i++) {
            st = new StringTokenizer(br.readLine());
            int robot = Integer.parseInt(st.nextToken());
            String order = st.nextToken();
            int repeat = Integer.parseInt(st.nextToken());

            int ori_r = r[robot];
            int ori_c = c[robot];

            for (int d = 1; d <= repeat; d++) {
                if (order.equals("L")) {
                    rot[robot] -= 1;
                    if (rot[robot] == -1) {
                        rot[robot] = 3;
                    }
                }
                else if (order.equals("R")) {
                    rot[robot] += 1;
                    if (rot[robot] == 4) {
                        rot[robot] = 0;
                    }
                }
                else if (order.equals("F")) {
                    int nr = r[robot] + dr[rot[robot]];
                    int nc = c[robot] + dc[rot[robot]];
                    if (nr > 0 && nr < map.length && nc > 0 && nc < map[0].length) {
                        if (map[nr][nc] == 0) {
                            r[robot] = nr;
                            c[robot] = nc;

                            continue;
                        } else {
                            System.out.println("Robot " + robot + " crashes into robot " + map[nr][nc]);
                            return;
                        }
                    } else {
                        System.out.println("Robot " + robot + " crashes into the wall");
                        return;
                    }
                }
            }
            map[ori_r][ori_c] = 0;
            map[r[robot]][c[robot]] = robot;

        }
        System.out.println("OK");
    }

    static void print(int[][] map) {
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[0].length; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }
}

 

 

 

 

발생한 문제 & 해결 방안

너무 오랜만에 코드를 풀어서 그런지 뒤집고 아래에서 위로 올라오는 순서 등을 고려하다가 시간을 다소 할애하였다.

 

한 번도 Fail 하지 않고 문제는 풀었으나 주기적으로 문제를 풀면서 감을 놓치지 않는 것이 중요할 것 같다.

 

 

 

 

 

 

 

해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.

혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!

python source : https://github.com/ssh5212/conding-test-practice

java source : https://github.com/ssh5212/coding-test-java

공유하기

facebook twitter kakaoTalk kakaostory naver band