본문 바로가기
Algorithm

[백준/BOJ] 14503번 로봇 청소기 C++

by SoyeonCha 2025. 1. 26.

문제 링크 : https://www.acmicpc.net/problem/14503

 

맞힌 코드

#include <bits/stdc++.h>
using namespace std;

int n, m;
int r, c, d;
vector<vector<int>> room;
vector<vector<bool>> visited;

int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};

int turnLeft(int d){
    return (d+3) % 4;
}

int cleanUp(){
    int cnt = 0;
    
    while(true){
        if(!visited[r][c]){
            visited[r][c] = true;
            cnt ++;
        }
        
        bool notCleaned = false;
        int nx, ny;
        
        for(int i=0; i<4; i++){
            d = turnLeft(d);
            nx = r + dx[d];
            ny = c + dy[d];
            
            if(!visited[nx][ny] && room[nx][ny]==0){
                r = nx;
                c = ny;
                notCleaned = true;
                break;
            }
        }
        
        int back;
        int bx, by;
        
        if(!notCleaned){
            // 뒤로 가는 방향 계산
            back = (d + 2) % 4;
            bx = r + dx[back];
            by = c + dy[back];
            
            if(room[bx][by]==1){
                break;
            }
            else{
                r = bx;
                c = by;
            }
        }
    }
    return cnt;
}

int main(){
    cin >> n >> m;
    cin >> r >> c >> d;
    
    room.resize(n, vector<int>(m));
    visited.resize(n, vector<bool>(m, false));
    
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin >> room[i][j];
        }
    }
    
    cout << cleanUp();
}

 

메모

for문 조건 작성할 때 ; 써야 되는데 l 적어버리는 거 조심.

main이 아닌 다른 함수에서 visited 같은 2차원 배열을 사용하려면 전역 변수로 선언하고, main 함수 내에서 resize로 초기화하는 코드 작성 필요.