14503 : 로봇 청소기

CS·2026년 2월 15일

SSPS

목록 보기
1/10

formula

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

일때

  1. 반시계 90도(왼쪽 회전) = (d + 3) % 4

  2. 시계 90도(우측 회전) = (d + 1) % 4

  3. 뒤로 돌기(180도 회전) = (d + 2) % 4

Implementation

#include <iostream>
using namespace std;

int N, M;
int matrix[51][51]; 
int r, c, d;     // x, y, dir
int cnt = 0;     // result

// 북 동 남 서 = 위 오 아 왼
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };

void solve() {
    while (true) {
        // case 1
        if (matrix[r][c] == 0) {
            matrix[r][c] = 2; // 2 : Cleaned
            cnt++;
        }

        bool cleaned = false; // check flag

        // case 3
        for (int i = 0; i < 4; i++) {
            // 반시계 방향 90도(왼쪽 회전)
            d = (d + 3) % 4;

            int nx = r + dx[d];
            int ny = c + dy[d];

            // check
            if (nx >= 0 && nx < N && ny >= 0 && ny < M && matrix[nx][ny] == 0) {
                r = nx;
                c = ny;
                cleaned = true;
                break; // goto case 1
            }
        }

        // Case 2
        if (!cleaned) {
            int back_r = r - dx[d];
            int back_c = c - dy[d];

            // 2-2
            if (back_r >= 0 && back_r < N && back_c >= 0 && back_c < M && matrix[back_r][back_c] == 1) {
                break; // 동작 끝
            }
            // 2-1 goto case 1
            else {
                r = back_r;
                c = back_c;
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false); 
    cin.tie(NULL);

    cin >> N >> M;
    cin >> r >> c >> d;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> matrix[i][j];
        }
    }

    solve();

    cout << cnt << endl;
    return 0;
}

우선순위상 조건3을 먼저 구현하고 넘어가야 2번 진입해야됨

profile
학습

0개의 댓글