Problem
Problem URL : 로봇 청소기
[1] Answer Code (18. 10. 17)
#include<iostream>
#include<vector>
#define p pair<int,int>
using namespace std;
/*
문제에서 4방향 값은
[0 1 2 3]
[북 동 남 서]로 주어진다.
현재 북쪽(= 0)을 보고 있다면
다음에 체크해야하는 방향은 서쪽(= 3)이다.
*/
int indexDir[4] = {3,0,1,2};
/*
0 : 북쪽을 보고 있을 때 체크해야하는 좌표 값은
현재 좌표가 (i,j)라면 (i,j-1)이다.
1,2,3 방향에 대해서도 마찬가지이다.
*/
p changeDir[4] = {
p(0,-1),
p(-1,0),
p(0,1),
p(1,0)
};
// 동 북 서 남
int dx[] = {0,-1,0,1};
int dy[] = {1,0,-1,0};
int map[50][50];
int v[50][50];
int n,m;
bool inRange(int x, int y){
if(x<0 || x>=n || y<0 || y>=m)
return false;
return true;
}
// 북 동 남 서 순서
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
int x,y,dir;
cin >> x >> y >> dir;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin >> map[i][j];
}
}
int nx;
int ny;
while (1) {
/*
현재 값이 1이라면
더 이상 진행이 불가능한 상황이다.
*/
if( map[x][y] == 1)
break;
v[x][y] = 1;
int flag = 0;
for(int i=0; i<4; i++){
nx = x + changeDir[dir].first;
ny = y + changeDir[dir].second;
if( inRange(nx,ny) && map[nx][ny] == 0 && v[nx][ny] == 0){
dir = indexDir[dir];
x = nx;
y = ny;
flag = 1;
break;
}
dir = indexDir[dir];
}
/*
4방향 탐색이 불가능할 경우
방향은 유지한채 왔던 좌표로 움직인다.
changeDir[ indexDir[dir] ]
이 코드가 이해안된다면
직접 한 번 해보면 이해가 될꺼다.
*/
if( flag == 0 ){
x = x + changeDir[ indexDir[dir] ].first;
y = y + changeDir[ indexDir[dir] ].second;
}
}
int cnt = 0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if( v[i][j] == 1 )
cnt ++;;
}
}
cout << cnt << endl;
return 0;
}
Review
-
삼성 역량 테스트 기출 문제
-
처음에 문제 규칙이 이해가 되지 않아 시간이 걸렸다.
-
방향과 관련된 로직은 다른 코드를 보니까 내가 어렵게 구현한거 같다.
-
다음에 풀 땐 간결하게 풀어보도록 하자 !