알고리즘 문제 풀이/BOJ

[backjoon]14503 로봇청소기 java

v 2021. 10. 21. 16:00

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

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net


먼저 boolean타입의 2차원 배열을 이용하여 청소한 부분을 확인해주고 계속해서 현재 위치를 끌고 나갔다.
청소가 안 되었다면 청소를 해주고,(marked = true)
왼쪽 방향(현재 방향을 기준으로 반시계 방향)에 청소를 해야한다고 할때, 새로운 좌표가 청소를 안 한 상태에 청소를 할 수 있다면 새로운 좌표로 다시 탐색 해주었다.
반대로 청소를 완료했거나 청소를 할 수가 없다면(벽이라서) 현재 위치는 그대로 둔 채 회전만 진행하여 다시 탐색을 진행하였다.(C)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import java.io.*;
import java.util.*;
 
/**
 * DFS를 이용해서 완전 탐색해야 하는 문제
 * 방향 설정이 되게 중요하다.
 **/
class Main {
    static boolean[][] marked;
    static int[][] dirs = { { -10 }, { 01 }, { 10 }, { 0-1 } }; //북 동 남 서
    static int N, M, answer;
    static int[][] map;
 
    public static void main(String[] args) throws Exception {
        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());
        marked = new boolean[N][M];
        map = new int[N][M];
 
        st = new StringTokenizer(br.readLine());
        int curR = Integer.parseInt(st.nextToken());
        int curC = Integer.parseInt(st.nextToken());
        int d = Integer.parseInt(st.nextToken());
 
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                int cur = Integer.parseInt(st.nextToken());
                map[i][j] = cur;
            }
        }
 
        clean(0, d, curR, curC);
        System.out.println(answer);
    }
 
    public static void clean(int cnt, int d, int curR, int curC) {
        if (cnt == 4) { // 4방향 청소가 다 됨.
            int nextD = (d +2) %4;
            int nextR = curR + dirs[nextD][0];
            int nextC = curC + dirs[nextD][1];
            // D : 뒤쪽이 벽인 경우들
            if (nextR < 0 || nextC < 0 || nextR >= N || nextC >= M)
                return;
            if (map[nextR][nextC] == 1) {// 벽
                return;
            }
            // C
            clean(0, d, nextR, nextC);
            return;
        }
 
        // 현재위치 청소
        if (!marked[curR][curC]) {
            marked[curR][curC] = true;
            answer++;
        }
        //왼쪽부터 즉, 시계 반시계 방향으로 회전하며 탐색해야한다.
        int nextD = (d + 3) % 4;
        int nextR = curR + dirs[nextD][0];
        int nextC = curC + dirs[nextD][1];
 
        // 청소가 되지 않았고, 청소를 할 수 있다면 한칸 전진!!
        if (!marked[nextR][nextC] && map[nextR][nextC] == 0) {
            clean(0, nextD, nextR, nextC);
            return;
        }
        // 청소가 이미 되었고, 뒤쪽이 벽이지만 후진해서 이동 할 수 있는 겅우!!
        if (marked[nextR][nextC] || map[nextR][nextC] == 1) {
            clean(cnt + 1, nextD, curR, curC);
            return;
        }
    }
}
 
cs
반응형

'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글

[backjoon]1924 2007년 java  (0) 2022.01.02
[backjoon]14891 톱니바퀴 java  (0) 2021.10.23
[backjoon]21608 상어초등학교 java  (0) 2021.10.15
[backjoon]19238 스타트택시 java  (0) 2021.10.06
[backjoon]3055 탈출 java  (0) 2021.10.06