본문 바로가기

알고리즘/삼성sw역량테스트 기출

삼성 SW 역량테스트 기출 :: 로봇 청소기

반응형

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

난이도 : 하

 

* 문제에서 방향을 북동남서 순서로 줬는데, 북서남동으로 풀어서 헤맴..

 

1. 북,동,남,서 방향으로 한 칸을 움직일 때의 인덱스 변화를 vector<pair<int,int>> dirs;에 저장해 두고(setDir()부분)  인덱스를 계산함

2. 문제의 지시대로 로봇 청소기의 움직임을 cleanNext에 구현

 

/* 로봇 청소기 */


#include <iostream>
#include <stdio.h>
#include <vector>
#define FOR(i, n) for(int i = 0 ; i < n ; i ++)

using namespace std;

int n, m, r, c, d, rslt;
int board[52][52];
//direction 0: 북, 1:동, 2:남, 3:서 /* 북동남서로 주어졌는데 방향을 거꾸로 보고함... 계속 2%에서 걸림!*/
vector<pair<int,int>> dirs;

void printBoard() {
    FOR(i, n) {
        FOR(j, m)
            printf("%d ", board[i][j]);
        cout << endl;
    }
}
void setDir() {
    dirs.push_back(make_pair(-1, 0));
    dirs.push_back(make_pair(0, 1));
    dirs.push_back(make_pair(1, 0));
    dirs.push_back(make_pair(0, -1));
}
int leftDir(int d) {
    if (d == 0) return 3;
    else return (d - 1);
}
void getInput() {
    // get Input
    scanf("%d %d", &n, &m);
    scanf("%d %d %d", &r, &c, &d);
    FOR(i, n)
        FOR(j, m)
            cin >> board[i+1][j+1];
}

void cleanNext(int r, int c, int d, int allDir) {
    if (board[r][c] == 0) {
        rslt++;
        board[r][c] = 2;
    }
    // 왼쪽 방향으로 회전하고 하나 전진했을 때 위치
    int r2 = r + dirs[leftDir(d)].first;
    int c2 = c + dirs[leftDir(d)].second;
    // 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
    if (board[r2][c2] == 0)
        return cleanNext(r2, c2, leftDir(d), 0);
        // 왼쪽 방향이 벽이거나 이미 청소되어있으면
        // 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
    else if(allDir == 3) {
        d = leftDir(d);
        // 방향을 유지하면서 후진했을 때의 위치
        int r3 = r - dirs[d].first;
        int c3 = c - dirs[d].second;
        //후진도 못하는 경우에는 작동을 멈춤
        if (board[r3][c3] == 1) return;
        else return cleanNext(r3, c3, d, 0);
    }
        // 아직 네 방향 다 본 건 아니면 왼쪽 방향으로 회전하고 2번으로 돌아간다.
    else
        return cleanNext(r, c, leftDir(d), allDir + 1);


}
int main() {
    rslt = 0;
    getInput();
    setDir();
    cleanNext(r+1, c+1, d, 0);
//    printBoard();
    cout << rslt << endl;
    return 0;
}
반응형