일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 카카오
- 2019 KAKAO BLIND RECRUITMENT
- 2018 카카오
- 알고리즘
- 2020 KAKAO BLIND RECRUITMENT
- 카카오 공채
- 삼성 SW 역량테스트
- gradle
- 삼성 SW 기출문제
- 2019 카카오 공채
- 백준
- set
- 2018 KAKAO BLIND RECRUITMENT
- 젠킨스
- 부스트코스
- 자바
- gcp
- 2018 KAKAO BLIND RECRUITMENT 1차
- bfs
- Baekjoon
- map
- 프로그래머스
- 2019 카카오 개발자 겨울 인턴십 코딩테스트
- Java
- 2020 카카오 공채
- dfs
- 비트마스크
- CS 스터디
- c++
- 2018 카카오 공채
Archives
- Today
- Total
아무코딩
[백준 14503] 로봇청소기 본문
문제풀이
문제에 명시되어있는 로봇청소기 작동 로직을 그대로 따라 하면 된다. (시뮬레이션 문제)
후진 시 바라보는 방향을 안 바꿔줘야 되는데 실수로 바꿔버리는 바람에 오류 잡느라 다 찍어보며 시간이 걸렸다.
소스코드
더보기
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
74
75
76
77
78
|
#include <stdio.h>
#include <stdio.h>
int N, M;
typedef struct Robot {
int r, c, d;
Robot() {}
Robot(int rr, int cc, int dd) { r = rr; c = cc; d = dd; }
}Robot;
int Map[51][51];
int dir_row[4] = {-1,0,1,0};
int dir_col[4] = {0,1,0,-1};
int cnt = 0;
bool isRange(int r, int c) {
return r >= 0 && c >= 0 && r < N&&c < M;
}
void printMap(Robot robot) {
printf("\ncnt : %d\n", cnt);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (i == robot.r&&j == robot.c)
printf("R ");
else
printf("%d ", Map[i][j]);
}
printf("\n");
}
}
void cleanMap(Robot robot) {
//현재위치 청소
if (Map[robot.r][robot.c] == 0) {
cnt++;
Map[robot.r][robot.c] = 2;
}
//printMap(robot);
for (int i = 0; i < 4; i++) {
int cur_dir = robot.d;
int left_dir = (robot.d - 1) < 0 ? 3 : robot.d - 1;
int next_row = robot.r + dir_row[left_dir];
int next_col = robot.c + dir_col[left_dir];
if (isRange(next_row, next_col) && Map[next_row][next_col] == 0) {
cleanMap(Robot(next_row, next_col, left_dir));
return;
}
robot.d = (robot.d + 3) % 4;
}
//한칸 후진 해야됨.
int back_dir = (robot.d + 2) % 4;
int next_row = robot.r + dir_row[back_dir];
int next_col = robot.c + dir_col[back_dir];
if (isRange(next_row, next_col) && Map[next_row][next_col] !=1) {
cleanMap(Robot(next_row, next_col,robot.d));
return;
}
//다안되는 경우 일로통과 그리고 리턴됨
return;
}
int main() {
Robot robot;
scanf("%d %d", &N, &M);
scanf("%d %d %d", &robot.r, &robot.c, &robot.d);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &Map[i][j]);
}
}
cleanMap(robot);
printf("%d\n", cnt);
}
|
문제 링크 : https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음
www.acmicpc.net
'알고리즘 > 백준' 카테고리의 다른 글
[백준 15685] 드래곤 커브 (0) | 2020.04.15 |
---|---|
[백준 5214] 환승 (0) | 2020.04.15 |
[백준 16638] 괄호 추가하기 2 (1) | 2020.03.31 |
[백준 12094] 2048(hard) (0) | 2020.03.29 |
[백준 15683] 감시 (0) | 2020.03.27 |
Comments