본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 8972 번 : 미친 아두이노

반응형

www.acmicpc.net/problem/8972

 

8972번: 미친 아두이노

요즘 종수는 아두이노를 이용해 "Robots"이라는 게임을 만들었다. 종수는 아두이노 한대를 조정하며, 미친 아두이노를 피해다녀야 한다. 미친 아두이노는 종수의 아두이노를 향해 점점 다가온다.

www.acmicpc.net

구현 문제였습니다.

 

풀이방법

 1. 매 이동마다 문제에 나와있는 1 ~ 5를 수행합니다. 

 

 2. 종수를 이동시킵니다. 이 때 이동하려는 곳에 미친 아두이노가 있다면 X 번째 움직임을 반환합니다. 잘 이동한다면 이동시킨 후 0을 반환합니다.

 

 3. 미친 아두이노들을 이동시킵니다. 최소 거리로 이동시킵니다. map으로 미친 아두이노들의 r,c좌표를 pair로 하여 key를 설정하고 그곳의 아두이노 개수를 저장해줍니다. 

 

 4. 0이 아닌 값이 move변수에 저장되어있다면 제대로 이동하지 못하고 게임이 종료 됩니다.

 

 5. i,j구역에 미친 아두이노의 개수가 없거나 1초과해서 있다면 key를 지워줍니다.

 

Code

#include <bits/stdc++.h>
using namespace std;
int n,m;
int dx[] = {0, 1, 1, 1, 0, 0, 0, -1, -1,-1};
int dy[] = {0,-1, 0, 1,-1, 0, 1, -1,  0, 1};
string moveInfo;
struct Jongsu {int x, y;};
Jongsu jongsu;
char board[101][101];
map <pair<int,int>,int> arduino;

int moveJongsu(int dir, int move){
    board[jongsu.x][jongsu.y] = '.';
    jongsu.x += dx[dir];
    jongsu.y += dy[dir];
    if(board[jongsu.x][jongsu.y] != '.') return move;
    board[jongsu.x][jongsu.y] = 'I';
    return 0;
}

int moveArduino(int move){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(board[i][j] == 'R'){
                int moveDir = 0;
                int minDist = 0x3f3f3f3f;
                for(int dir = 1; dir <= 9; dir++){
                    int nx = i + dx[dir];
                    int ny = j + dy[dir];
                    if(0 > nx || nx >= n || 0 > ny || ny >= m) continue;
                    int dist = abs(nx - jongsu.x) + abs(ny - jongsu.y);
                    if(minDist > dist){
                        moveDir = dir;
                        minDist = dist;
                    }
                }
                int nx = i + dx[moveDir];  
                int ny = j + dy[moveDir];
                if(board[nx][ny] == 'I') return move;
                if(arduino[{i,j}]) arduino[{i,j}]--;
                arduino[{nx,ny}]++;
            }
        }
    }
    
    return 0;
}

void boom(){
    vector <pair<int,int>> v;
    for(auto &a : arduino){
        if(a.second != 1) v.push_back(a.first);
    }
    for(auto &p : v){
        arduino.erase(p);
    }
}

void updateBoard(){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            board[i][j] = '.';
        }
    }
    board[jongsu.x][jongsu.y] = 'I';
    for(auto &a : arduino){
        pair <int,int> p = a.first;
        board[p.first][p.second] = 'R';
    }
}

void print(){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++) {
            cout << board[i][j];
        }
        cout << '\n';
    }
}

int main(){
    cin >> n >> m;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cin >> board[i][j];
            if(board[i][j] == 'I') jongsu.x = i, jongsu.y = j;
            if(board[i][j] == 'R') arduino[{i,j}] = 1;
        }
    }

    cin >> moveInfo;

    for(int i = 0; i < moveInfo.size(); i++){
        int dir = moveInfo[i] - '0';
        int move = 0;
        move = max(move,moveJongsu(dir,i+1));
        move = max(move,moveArduino(i + 1));
        if(move){
            cout << "kraj " << move << '\n';
            return 0;
        }
        boom();
        updateBoard();
        
    }
    print();
}