# 문제링크
문제가 잘 읽히지 않아서 애를 먹었지만, 설명에 나온 그대로만 구현하니 패스가 되었네요. 로봇은 x, y 좌표와 방향을 저장할 수 있도록 struct 로 구성했고, 왼쪽으로 가는 방향이나 후진 방향 정하는 거는 그냥 배열로 적어주었습니다. 왼쪽으로 가는 방향은 그냥 -1 만 해줘도 되었을 것 같네요.
# 제출 코드
#include <cstdio>
using namespace std;
int N, M;
int map[51][51];
struct st {
int y;
int x;
int d;
};
st robot;
// 0 : 북쪽, 1 : 동쪽, 2: 남쪽, 3: 서쪽
int xd[] = { 0,1, 0, -1 };
int yd[] = { -1, 0, 1, 0 };
void Input() {
scanf("%d %d", &N, &M);
scanf("%d %d %d", &robot.y, &robot.x, &robot.d);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &map[i][j]);
}
}
}
int dir[] = { 3, 0, 1, 2 }; // 현재 방향 기준으로 왼쪽
int back[] = { 2, 3, 0, 1 }; // 후진하는 방향
int Simul(){
int ans = 0;
bool flag;
while (true) {
flag = false;
if (map[robot.y][robot.x] == 0) {
map[robot.y][robot.x] = 2; // 현재 위치 청소
ans++;
}
for (int i = 0; i < 4; i++) {
int nd = dir[robot.d]; // 현재 방향을 기준으로 왼쪽
int ny = robot.y + yd[nd];
int nx = robot.x + xd[nd];
if (map[ny][nx] == 0) {
robot.d = nd;
robot.y = ny;
robot.x = nx;
flag = true;
break;
}
else {
robot.d = nd;
}
}
if (flag) continue;
else {
// 네 방향 모두 청소가 되어있거나 벽인 경우 후진
int nd = back[robot.d];
int ny = robot.y + yd[nd];
int nx = robot.x + xd[nd];
if (map[ny][nx] == 1) return ans; //후진도 못하면 리턴
else {
robot.y = ny;
robot.x = nx;
}
}
}
return ans;
}
int main() {
Input();
printf("%d\n", Simul());
}
반응형
'Computer Science&Engineering > 코딩테스트' 카테고리의 다른 글
[ 백준 14889 ] 스타트와 링크 C/C++ DFS (0) | 2021.04.17 |
---|---|
[ 백준 14888 ] 연산자 끼워넣기 C++ DFS 풀이 (0) | 2021.04.17 |
[백준 14502] 연구소 C++ (0) | 2021.04.17 |
[백준 14501] 퇴사 C++ (0) | 2021.04.17 |
[백준 14500] 테트로미노 C++ 노가다풀이 (0) | 2021.04.17 |