백준 14503 (삼성 SW 역량평가 기출) - 로봇 청소기
백준 14503번 문제에 대한 풀이입니다.
이 포스팅은 삼성 GIST 모터 트랙 대비 과정에서 풀었던 기출 문제에 대한 글입니다. 모두 백준에 공개된 문제들만 있으며, SW Expert Academy에서만 다루는 문제들은 저작권 문제로 업로드 되지 않습니다.
1. 문제 내용
문제 링크: https://www.acmicpc.net/problem/14503
문제 난이도: GOLD V
2. 접근법
- 2차원 좌표계에서 이리저리 이동하는 시뮬레이션 문제.
- 외벽이 항상 1로 둘러싸여 있고, 이동 조건에서 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
68
69
70
71
72
73
#include <iostream>
using namespace std;
int N, M, r, c, d;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
int room[50][50];
int simulate() {
int cnt = 0;
while(true) {
//1. 현재 칸이 청소되지 않은 경우 청소하기
if(room[r][c] == 0) {
room[r][c] = -1;
cnt++;
}
// 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는지 확인
bool found = false;
for(int i = 0; i < 4; i++) {
int nx = r + dx[i];
int ny = c + dy[i];
if(room[nx][ny] == 0) {
found = true;
}
}
if(found) { // 3. 청소되지 않은 빈 칸이 있는 경우
d = (d + 3) % 4; //반시계로 90도 회전
int mx = r + dx[d];
int my = c + dy[d];
if(room[mx][my] == 0) {// 바라보는 곳이 청소가 안된 빈칸인 경우
r = mx; c = my; // 한 칸 전지
}
}
// 2. 청소되지 않은 빈 칸이 없는 경우
if(!found) {
//후진 가능한지 확인
int back_dir = (d + 2) % 4;
int nx = r + dx[back_dir];
int ny = c + dy[back_dir];
if(room[nx][ny] == 1) { // 2-b. 후진이 불가한 경우
return cnt; // 작동 멈추기
}
// 2-a. 후진이 가능한 경우 후진 후 1번으로 돌아가기
r = nx; c = ny;
}
}
return cnt;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> N >> M;
cin >> r >> c >> d;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
cin >> room[i][j];
}
}
int cnt = simulate();
cout << cnt << '\n';
return 0;
}
4. 중요 포인트
- 2차원 배열 좌표계 다루는 법 중요! 특히 dx, dy 테크닉인 코드 가독성도 늘릴 수 있어서 익히면 정말 좋은 것 같음.
- 구현은 항상 차분히 하나씩.
- 문제 조건이 2가지로 해석이 가능한 경우, 당황하지 말고 2가지 경우가 근본적으로 같은 것이 아닌지 확인해보기! 출제자는 바보가 아님!
- 방향 전환 등에 있어서 나머지 연산 실수하지 말기
This post is licensed under CC BY 4.0 by the author.