안녕하세요! 테크지니어22입니다.
오늘은 백준 알고리즘 1405번 - 로봇 청소기를 풀어보도록 하겠습니다.
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽
www.acmicpc.net
[문제 접근]
이 문제는 특별한 자료구조나 알고리즘 개념이 포함된 것이 아니고, 문제에 나와있는 데로 구현하면 됩니다.
[풀이 전략]
생략
[코드]
#include <iostream>
#include <algorithm>
using namespace std;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
int n, m ;
int arr[51][51]; // 방 상태
int tot ;
int x,y,d ;
bool isExisted() {
for(int i = 0 ; i < 4 ; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= n-1 || nx <= 0 || ny >= m-1 || ny <= 0) continue;
if(arr[nx][ny] == 0) return true; // 빈칸 존재하면
}
return false;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m ;
cin >> x >> y >> d ;
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < m ; j++)
cin >> arr[i][j];
while (true)
{
if(arr[x][y] == 0) arr[x][y] = -1;
if(!isExisted()) { // 빈칸 없음
int nx = x + dx[(d+2)%4];
int ny = y + dy[(d+2)%4];
if(arr[nx][ny] == 1) break;
x = nx ; y = ny;
} else { // 빈칸 있음
d = (d+3)%4;
int nx = x + dx[d];
int ny = y + dy[d];
if(arr[nx][ny] == 0) { x = nx; y =ny ; }
}
}
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < m ; j++)
if(arr[i][j] == -1) tot++;
cout << tot ;
}
[배울 점]
- 틀렸을 때 변수 업데이트를 제대로 해주었는지, 디버깅출력문을 삭제를 했는지 확인하기.
'알고리즘 > 백준' 카테고리의 다른 글
[백준/C++] 알고리즘 20922번 - 겹치는 건 싫어 (1) | 2024.04.09 |
---|---|
[백준/C++] 알고리즘 2531번 - 회전 초밥 (0) | 2024.04.09 |
[백준/C++] 알고리즘 13335번 - 트럭 (0) | 2024.04.08 |
[백준/C++] 알고리즘 2805번 - 나무 자르기 (0) | 2024.04.06 |
[백준/C++] 알고리즘 18869번 - 멀티버스 II (0) | 2024.04.06 |