개요
이번 문제도 삼성의 기출문제라고 합니다.
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
리뷰와 피드백
구현을 요구하는 문제였기에 크게 특별한 발상을 요구하지는 않았지만 현재 봐라보는 방향에서의 회전 위치를 배열에 담고 해당 배열을 문제조건에 맞게 구현하는 식을 찾아내는게 조금 특별한 발상이였다고 생각합니다.
다른 부분은 크게 특별한 것 없이 문제에서 요구하는 사항을 따라 작성하였고
다른 분들의 코드도 크게 다르지 않았습니다만 문제에서 제시한 순서대로 작성하지 않은 분들도 있었습니다.
개선 전 / 후 코드 전문
#include <iostream>
#include <algorithm>
#define X first
#define Y second
using namespace std;
using pos = pair<int, int>;
int n, m;
pos robot_pos; // 로봇청소기의 시작 위치
int robot_dir; // 로봇청소기의 시작 방향
int ans;
int board[53][53];
// 개선 사안. 실제사용되는 건 [][0], [][3] 원소들 뿐
// 0인덱스 북쪽방향일 시 왼쪽부터 탐사하는 방향 (1인덱스 동, 2인덱스 남, 3인덱스 서)
int dir_x[4][4] = { { 0, 1, 0,-1 }, { -1, 0, 1, 0 }, { 0, -1, 0, 1 }, { 1, 0, -1, 0 } };
int dir_y[4][4] = { { -1, 0, 1, 0 }, { 0, -1, 0, 1 }, { 1, 0, -1, 0 }, { 0, 1, 0, -1 } };
int blocked_cnt; // 한 위치에서 몇 번 방향을 바꿨는지 저장. 4일 시 그 위치에서 모든 방향이 막힘
void rec(int st_x, int st_y, int cur_dir, int &blocked_cnt) {
int n_x = st_x + dir_x[cur_dir][0];
int n_y = st_y + dir_y[cur_dir][0];
// 동작 1
// 현재 위치 청소
if (board[st_x][st_y] == 0) {
++ans; /*** 수정 사항 ***/ // 실수로 지웠습니다.
board[st_x][st_y] = 2; // 벽과 구분할 수 있는 임의의 수
}
// 동작 2.1
// 왼쪽 방향 공간 존재
if ((n_x >= 0 && n_x <= n && n_y >= 0 && n_y < m) && board[n_x][n_y] == 0) {
blocked_cnt = 0;
rec(n_x, n_y, (cur_dir + 3) % 4, blocked_cnt);
return;
}
// 동작 2.3 , 2.4
// 현재 위치 네 방향 막혔음
if (blocked_cnt == 4) {
int b_x = st_x - dir_x[cur_dir][3];
int b_y = st_y - dir_y[cur_dir][3];
if ((b_x >= 0 && b_x < n ) && (b_y >= 0 && b_y < m)) {
if (board[b_x][b_y] == 1) return; // 동작 2.4 뒤가 벽이여서 종료
blocked_cnt = 0;
rec(b_x, b_y, cur_dir, blocked_cnt); // 동작 2.3 뒤가 벽이 아니여서 이동
return;
}
else return;
}
// 동작 2.2
// 왼쪽 방향 청소할 구간 없다면 그 방향으로 회전
rec(st_x, st_y, (cur_dir + 3) % 4, ++blocked_cnt);
return;
}
int main() {
cin >> n >> m >> robot_pos.X >> robot_pos.Y >> robot_dir;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
cin >> board[i][j];
rec(robot_pos.X, robot_pos.Y, robot_dir, blocked_cnt);
cout << ans << '\n';
}
향후 방침, 느낀 점
막막하게 느껴지던 구현문제도 한 두 문제 풀어보니 조금씩 자신감이 생깁니다. 재밌네욧!
'함께 스터디 > PS스터디 심화반' 카테고리의 다른 글
[PS스터디 심화반] 4주차 백준 감시 (0) | 2022.08.01 |
---|---|
[PS스터디 심화반] 3주차 백준 외판원 순회 (0) | 2022.08.01 |
[PS스터디 심화반] 3주차 백준 소수의 연속합 (0) | 2022.08.01 |
[PS스터디 심화반] 2주차 백준 보석도둑 (0) | 2022.08.01 |
[PS스터디 심화반] 1주차 백준 거짓말 (0) | 2022.08.01 |
댓글