본문 바로가기
PS/BOJ

[자바] 백준 13567 - 로봇 (java)

by Nahwasa 2022. 10. 25.

 문제 : boj13567


 

필요 알고리즘 개념

  • 구현, 시뮬레이션
    • 문제에서 제시된 대로 구현만 잘 하면 풀 수 있다.

※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.

 


 

풀이

  변수들 설계만 잘 하면 의외로 엄청 쉽게 풀린다. 내 경우엔 아래와 같이 진행했다.

r : y축 값 (내 경우엔 y, x론 헷갈려서 행과 열을 뜻하는 row, column으로 r과 c를 주로 사용한다.) - 초기값 0

c : x축 값 - 초기값 0

dir : 0-북, 1-동, 2-남, 3-서

 

  일단 이렇게만 해두면, 이제 TURN 0은 dir-- 이다. TURN 1은 dir++ 만 해주면 된다(추가로 dir이 음수면 3으로, dir이 4면 0으로 변경해주자.).

 

  그리고 MOVE로 이동될 값을 미리 DR, DC로 정의해두었다. 좌측 아래가 (0, 0)이므로 dir이 0일 경우 북쪽이라서 r값이 + 되어야 하므로 DR[0] = 1이다. 북쪽으로 이동할 경우 c값은 그대로이므로 DC[0] = 0이다. 이런식으로 설정하면 아래와 같다.

    private static final int[] DR = {1, 0, -1, 0};
    private static final int[] DC = {0, 1, 0, -1};

 

  그럼 이제 MOVE X가 입력으로 들어올 경우, 현재 dir을 기준으로 r+=X * DR[dir]; c+=X * DC[dir]; 을 해주면 해당 방향으로 이동한게 된다. MOVE 연산이 끝난 후 r이 음수 혹은 m이상, c가 음수 혹은 m이상이라면 해당 명령어 열은 유효하지 않은 것이므로 '-1'을 출력하고 바로 프로그램을 종료하면 된다. 명령어 열이 유효했다면 모든 연산이 끝난 후 c와 r값을 출력해주면 된다.

 


 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    private static final int[] DR = {1, 0, -1, 0};
    private static final int[] DC = {0, 1, 0, -1};
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int m = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());
        int r = 0;
        int c = 0;
        int dir = 1;
        while (n-->0) {
            st = new StringTokenizer(br.readLine());
            if (st.nextToken().charAt(0) == 'T') {
                dir += st.nextToken().charAt(0) == '0' ? -1 : 1;
                if (dir < 0) dir = 3;
                if (dir > 3) dir = 0;
            } else {
                int dist = Integer.parseInt(st.nextToken());
                r += DR[dir]*dist;
                c += DC[dir]*dist;
                if (r >= m || c >= m || r < 0 || c < 0) {
                    System.out.println(-1);
                    return;
                }
            }
        }
        System.out.println(c + " " + r);
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글