[백준] 로봇 청소기 Java

dustle·2023년 3월 28일
1

로봇 청소기가 돌아가는 매커니즘을 구현하는 문제입니다.

static int[] viewX = {-1, 0, 1, 0};
static int[] viewY = {0, 1, 0, -1};

북동서남으로 돌아가는 인덱스를 짜놓고, 왼쪽으로 돌때마다 인덱스가 3씩 바뀌는 것을 이용합니다. (후진이면 +2)

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

public class Main {
    public static int N;
    public static int M;
    public static int rsl;
    static int[] viewX = {-1, 0, 1, 0};
    static int[] viewY = {0, 1, 0, -1};
    public static int[][] arr;
    public static boolean[][] visited;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        int x = Integer.parseInt(st.nextToken());
        int y = Integer.parseInt(st.nextToken());
        int view = Integer.parseInt(st.nextToken());

        arr = new int[N][M];
        visited = new boolean[N][M];

        for(int i = 0; i < N; i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < M; j++){
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        move(x, y, view);
        System.out.println(rsl);
    }
    public static void move(int x, int y, int view){
        boolean flag = false;

        if(!visited[x][y]) {
            rsl++;
            visited[x][y]=true;
        }

        for (int k = 0; k < 4; k++) {
            int dx = x + viewX[(view+3)%4];
            int dy = y + viewY[(view+3)%4];

            if(arr[dx][dy]==0 && !visited[dx][dy]) {
                move(dx,dy,(view+3)%4);
                flag = true;
                break;
            }
            view = (view+3)%4;
        }

        if(!flag){
            int dx = x + viewX[(view+2)%4];
            int dy = y + viewY[(view+2)%4];

            if(arr[dx][dy]==0) {
                move(dx, dy, view);
            }
        }
    }
}

0개의 댓글