728x90
🔗 문제 링크
💡 문제 풀이 및 해석
- 문제의 전체적인 흐름은 '현재 칸 청소'
- 반시계 90도로 회전하면서 청소할 있을 경우 이동
- 한 바퀴 돌고도 청소할 공간이 없다면 후진한다.
- 후진할 공간이 없다면 작동을 멈춘다.
⭐️ 정답 코드 및 설명
#include<iostream>
using namespace std;
int N, M, r, c, d;
int dir[] = { 0,3,2,1 };
int next_x[] = { 0,1,0,-1 };
int next_y[] = { -1,0,1,0 };
struct Map
{
bool isClean = false;
int Wall;
};
Map MAP[50][50];
void input() {
cin >> N >> M;
cin >> r >> c >> d;
for (int y = 0; y < N; y++) {
for (int x = 0; x < M; x++) {
cin >> MAP[y][x].Wall;
if (MAP[y][x].Wall == 1) MAP[y][x].isClean = true;
}
}
}
void sol() {
int sy = r, sx = c;
int answer = 0;
while (1) {
if (!MAP[sy][sx].isClean) {
MAP[sy][sx].isClean = true;
answer++;
}
bool go = false;
for (int i = 0; i < 4; i++) { // 반 시계방향
d = (d + 3) % 4; // 반시계 방향으로 90도 회전
int nx = sx + next_x[d], ny = sy + next_y[d];
if (nx > -1 && ny > -1 && ny < N && nx < M) {
if (!MAP[ny][nx].isClean) { // 벽이 아니고 청소도 안되있으면 이동
sy += next_y[d], sx += next_x[d];
go = true;
break;
}
}
}
if (!go) { // 이동하지 못했다면
// 2-Case
int nx = sx + next_x[(d+2)%4], ny = sy + next_y[(d+2)%4];
if (nx < 0 || nx >= M || ny < 0 || ny >= N || MAP[ny][nx].Wall == 1) {
cout << answer;
break;
}
else {
sy = ny;
sx = nx;
}
}
}
}
int main() {
input();
sol();
return 0;
}
😅 문제 후기
문제를 푸는데, 전체적으로는 푸는데 어려운점은 없었지만, '북동남서' 와 '북서남동' 두가지 방법 있는데, 반시계 방향이니 '북서남동'으로 움직이는 방법으로 선택했다.
이 때,
int next_x[] = { 0,1,0,-1 };
int next_y[] = { -1,0,1,0 };
대신에,
int next_x[] = { 0,-1,0,1 };
int next_y[] = { -1,0,1,0 };
을 선택하여 (d+1) % 4 형식으로 문제를 풀었는데, 이렇게하면 틀린다고 한다. 그래서 이 부분만 위쪽의 코드로 (d+3) % 4 로 하면 해결되는데, 우선순위의 문제 때문에, 이런 방식으로 문제를 풀어야 한다고 질문게시판에 있었지만, 아직 잘 이해가 되지 않는다. 둘다 탐색하는 방식은 북->서->남->동으로 동일하다고 생각하고, 예제도 제대로 풀리는데 조금 더 공부해서 리뷰를 남겨놓겠다.
728x90
'알고리즘 문제 풀이' 카테고리의 다른 글
[ 백준 21608 ] 상어 초등학교 (C++) - 구현, BruteForce (0) | 2024.03.06 |
---|---|
[ 백준 17144 ] 미세먼지 안녕! (C++) - 구현 (0) | 2024.03.06 |
[ 백준 1405 ] 미친 로봇 (C++) - DFS (0) | 2024.03.05 |
[ 프로그래머스 ] 다단계 칫솔 판매 (C++) - 구현 (2) | 2024.03.05 |
[ 백준 1379 ] 강의실 2 (C++) - priority_queue (0) | 2024.03.05 |