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



시뮬레이션 문제로 문제에 제시된 바와 같이

로봇청소기의 움직임을 진행하면서 더이상 갈 곳이 없을 때 종료해주면 된다.


주의할 점은 현재의 진행 방향을 기준으로 왼쪽을 볼 때

(진행방향+3)%4을 통해 방향을 확인해주면 된다.


예를들어 현재 방향이 0일 때(북)

각 진행 방향에서 왼쪽을 확인하는 과정은 다음과 같다.


1) (0+3)%4= 3 (서쪽)

2) (3+3)%4 = 2 (남쪽)

3) (2+3)%4 = 1 (동쪽)

4) (1+3)%4 = 0(북쪽)


이렇게 3씩 더해주며 현재 방향에서 왼쪽을 확인하다보면 최종적으로 기존에 바라보던 방향이 나오게 된다.

만약 갈곳이 없다면 후진 유무를 체크해준 뒤에, 후진도 불가능하다면 종료하면 된다.



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
#include <iostream>
using namespace std;
 
//0:북, 1: 동, 2:남, 3:서
int dy[4]={-1,0,1,0};
int dx[4]={0,1,0,-1};
 
int main(){
    
    int N,M;
    int r,c,d;
    int map[51][51]={0};
    int visited[51][51]={0}; //청소 유무
    
    cin>>N>>M;
    cin>>r>>c>>d;
    
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            scanf("%d",&map[i][j]);
        }
    }
    
    int ans=0;
    while(true){
        
        //후진으로 오는 경우도 있기 때문에 청소 유무 체크
        if(!visited[r][c]){
            ans++;
            visited[r][c]++;
        }
        
        bool check=false;
        for(int i=0;i<4;i++){
            
            d=(d+3)%4//현재 위치에서 왼쪽 방향 회전
            int nr=r+dy[d];
            int nc=c+dx[d];
            
            if(nr<0 || nr >=|| nc<0 || nc>=M)
                continue;
            
            if(map[nr][nc] || visited[nr][nc])
                continue;
            
            check=true;
            r=nr;
            c=nc;
            break;
        }
        
        //후진 여부
        if(!check){
            
            r=r+dy[(d+2)%4];
            c=c+dx[(d+2)%4];
            
            if(r<0 || r >=|| c<0 || c>=|| map[r][c])
                break;
        }
    }
    
    cout<<ans<<endl;
    return 0;
    
}
 
cs


+ Recent posts