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

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음

www.acmicpc.net

이 문제를 읽었을 때는 시뮬레이션이라고 생각했다. 주어진 조건대로 그냥 코드를 짜면 된다고 생각했고

그 방법이 틀린 방법이 아니다. 실제로 많은 시뮬레이션결과로 짠 코드들이 존재했다.

이차원 평면에서 이동하는것은 그래프 탐색 or 시뮬레이션 이다. 어떤 것을 선택해서 구현하느냐는 본인의 선택이지만

제대로 된 선택을 해야 빠른시간안에 제대로 된 문제를 구현할 수 있다. 탐색의 핵심은 탐색을 해 나가는 것이다

하지만, 코드를 간결하게 하기 위해 재귀함수로 푸는 법을 찾아보게 되었다.

이 문제에서 중요한 포인트는 방향이다. 방향에 대해서만 잘 접근 하면 쉬워지는 문제이다.

다음방향을 어떻게 유도해 낼지 잘 고민해본후 연산을 통해 방향을 잘 정해주고 주어진 순서대로 해결해주었다.

 

**재귀함수를 사용해 줄때 어디서 어떻게 return해줄지를 잘 고민해봐야 한다

 

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
import java.util.Scanner;
 
public class Main {
    static int[][] map = new int[50][50];   //청소하는 장소
    static int count=1//청소하는 칸의 수
    static int dx[] = {-1,0,1,0};   //행 이동을 위한 배열   //북, 동, 남, 서
    static int dy[] = {0,1,0,-1};   //열 이동을 위한 배열
    static int N,M;
     
    static void dfs(int x, int y, int d){
        int nx,ny,nd=d;
        for(int i=0;i<4;i++) { //----->왼쪽 방향부터 탐색해주는것에 대해 네방향 모두를 연산에 의해 나타낼수 있음이 키 포인트이다.
            nd = (nd+3) % 4;   //----->해당 방법을 통해 어떤 방향이든 항상 왼쪽부터 4방향을 차례로 탐색할 수 있게 된다.
            nx = x +dx[nd];
            ny = y +dy[nd];
            
            if(nx < 0 || ny < 0 || nx >= N || ny >= M || map[nx][ny]==1continue//범위가 벗어나거나 벽이면 방향전환.
            if(map[nx][ny]==0) { //청소시작.
                count++;
                map[nx][ny]=2;
                dfs(nx,ny,nd);
                return//for문이 끝나고 아래로 코드로 내려가게 되면 갑자기 후진을 진행하게 되는 경우 발생.
            }
        }
        
        //4방향의 탐색이 모두 끝난 후.
        nd = (nd+2)%4//후진에 대한 방향 설명.
        nx = x+dx[nd];
        ny = y+dy[nd];
        if(map[nx][ny]==1return//벽이면 종료.
        else dfs(nx,ny,d);
    }
    
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int d,x,y;
         N=sc.nextInt();
         M=sc.nextInt();
          
         x=sc.nextInt();
         y=sc.nextInt();
         d=sc.nextInt();
          
         for(int i=0;i<N;i++)    //배열 입력받음
         {
             for(int j=0;j<M;j++)
             {
                 map[i][j]=sc.nextInt();
             }
         }
         map[x][y]=2;   //처음 위치는 먼저 청소하므로 청소했다고 표시
        dfs(x,y,d);
        System.out.println(count);
 
    }
 
}
 
cs

'알고리즘 > 그래프' 카테고리의 다른 글

[DFS완탐]백준_연산자끼워넣기  (0) 2019.04.12
[BFS]백준_아기상어  (0) 2019.04.11
[완탐/BFS]백준_연구소  (0) 2019.04.08
[DFS및예외처리]백준_테트로미노  (0) 2019.04.07
[그래프BFS]백준1012유기농배추  (0) 2019.03.10

+ Recent posts