(백준) 로봇 시물레이션 _ 2174

2021. 12. 10. 11:41·알고리즘/백준

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

 

🐢 설명

로봇들이 2차원 공간에 존재하고 주어진 명령에 따라 움직인다. 이때 주의할 점은 좌표평면의 원점이 좌측 하단이라서 일반적인 2차원 배열의 인덱스와 다르다는 점이다.

하지만 굳이 신경쓰지 않고 그대로 사용해도 문제는 없는데 다만 그렇게 하려면 움직이라는 명령에서 방향은 변경을 해줘야 한다. 동, 서 쪽은 위아래가 반대여도 그대로이니 상관이없고 북쪽은 남쪽으로 / 남쪽은 북쪽으로 변경해주면 좌표값은 그대로 사용해도 무방하다.

 

로봇이 로봇이 부딫힌 경우에는 해당 로봇의 번호도 알려줘야 하므로 맵에 각 로봇의 번호를 적어놨고 이동할 때 같이 수정하도록 했다. 로봇들은 배열에 담아 놓은 후 주어진 로봇 번호로 접근하여 로봇을 움직이게 했다.

 

🐢코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 로봇시물레이션_2174 {
    static int R, C, N, M, end;
    static Robot[] robots = new Robot[101];
    static int[][] map;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        C = Integer.parseInt(st.nextToken());
        R = Integer.parseInt(st.nextToken());
        map = new int[R][C];
        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken()) - 1;
            int y = Integer.parseInt(st.nextToken()) - 1;
            int dir = direction(st.nextToken());
            robots[i + 1] = new Robot(y, x, dir);
            map[y][x] = i + 1;
        }

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int idx = Integer.parseInt(st.nextToken());
            String order = st.nextToken();
            int count = Integer.parseInt(st.nextToken());

            move(idx, order, count);
            if (end == -1) return;
        }
        System.out.println("OK");
    }

    private static void move(int idx, String order, int count) {
        switch (order) {
            case "L":
            {
                while (count-- > 0) {
                    robots[idx].dir = (robots[idx].dir + 1) % 4;
                }
                return;
            }
            case "R":
            {
                while (count-- > 0) {
                    robots[idx].dir = (robots[idx].dir - 1);
                    if (robots[idx].dir < 0) robots[idx].dir = 3;
                }
                return;
            }
            case "F":
            {
                while (count-- > 0) {
                    int tmp = go(idx);
                    if (tmp == -1) {
                        System.out.printf("Robot %d crashes into the wall", idx);
                        end = -1;
                        return;
                    } else if (tmp > 0) {
                        System.out.printf("Robot %d crashes into robot %d", idx, tmp);
                        end = -1;
                        return;
                    }
                }
            }
        }
    }

    private static int go(int idx) {
        int[] dy = {-1, 0, 1, 0};
        int[] dx = {0, 1, 0, -1};

        Robot robot = robots[idx];
        map[robot.y][robot.x] = 0; // 이동시 적은 번호 지움
        int ny = robot.y + dy[robot.dir];
        int nx = robot.x + dx[robot.dir];
        if (ny < 0 || nx < 0 || ny >= R || nx >= C)
            return -1;
        else if (map[ny][nx] > 0)
            return map[ny][nx]; // 부딫힌 로봇의 번호를 반환
        else {
            map[ny][nx] = idx; // 맵에 번호 적어두기
            robots[idx].y = ny;
            robots[idx].x = nx;
            return 0;
        }
    }

    private static int direction(String nextToken) {
        switch (nextToken) {
            case "S": // 남쪽일 때 위로가게함 (좌표값을 그대로 사용하기 위해서)
                return 0;
            case "E":
                return 1;
            case "N": // 북쪽일 때 아래로 가게함
                return 2;
            case "W":
                return 3;
        }
        return -1;
    }

    private static class Robot {
        int y;
        int x;
        int dir;

        public Robot(int y, int x, int dir) {
            this.y = y;
            this.x = x;
            this.dir = dir;
        }
    }
}
🐢 마무리
반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

(백준) 일감호에 다리 놓기 _ 17490  (1) 2021.12.20
(백준) 싸지방에간 준하 _ 12764  (1) 2021.12.12
(백준) 불 _ 5427  (0) 2021.12.08
(백준) 뱀 _ 3190  (0) 2021.10.22
(백준) 마법사 상어와 파이어스톰  (0) 2021.10.19
'알고리즘/백준' 카테고리의 다른 글
  • (백준) 일감호에 다리 놓기 _ 17490
  • (백준) 싸지방에간 준하 _ 12764
  • (백준) 불 _ 5427
  • (백준) 뱀 _ 3190
구름뭉치
구름뭉치
구름의 개발일기장
    반응형
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (288) N
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (4) N
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (7)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    키보드 손목 받침대
    류블라냐
    마우스 패드
    동유럽
    크로아티아
    mx master s3 for mac
    레이저
    마우스
    부다페스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
(백준) 로봇 시물레이션 _ 2174
상단으로

티스토리툴바