본문 바로가기

알고리즘 (2020 : 08 : 10 ~ )/구현, 시뮬

[백준 / BOJ] 8972 미친 아두이노

문제

출처 : https://www.acmicpc.net/problem/8972

 

8972번: 미친 아두이노

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

www.acmicpc.net

종수는 R*C의 그리드에서 아두이노를 움직이는 게임을 진행한다.

 

이 게임에는, 종수의 아두이노와 미친 아두이노가 있으며, 미친아두이노는 항상 종수의 아두이노와 가장 가까워지는 방향으로 움직인다.

 

미친아두이노의 위치, 종수의 아두이노의 위치, 종수의 아두이노가 움직이는 방향이 주어졌을때, 그리드의 최종상태를 출력하는 문제다.

(단, 종수의 아두이노가 미친아두이노를 만난다면 즉시 종료하고, kraj 숫자) 를 출력한다.


풀이

R과 C가 각각 100

종수가 움직이는횟수가 최대 100이므로 기본적인 구현으로 풀리는 문제다.

 

문제를 풀때 주의할점이 몇가지있었는데,

 

1. 미친아두이노가 2개이상 만났을때 폭발이 일어난다. 이때, 종수의 아두이노가 폭발위치에 있다면 게임 종료다.

 

2. 아두이노를 움직이던중에, 값이 겹쳐져서 맞는값을 지우지 않도록 주의해야한다.

예를들어, 다음과 같은 배열이 있다고 하자.

 

A B . .

 

이때, A를 오른쪽으로 한칸 움직이고, B를 오른쪽으로 한칸 움직인다면, 구현에 따라서, B의 값이 A에 의하여 덮어씌워지고, B의 이동이 일어나지 않을수있다.

 

주요 소스코드

    private void simulate(){
        while(!aduino.move.isEmpty() && trig){
            clear();
            move(aduino, 'I'); // 정상 아두이노 움직이기
            merge();
            ans++;
            if(!trig) return; // 만났다면 끝
            for(int i = 0; i < crazyAduino.size(); i++){ // crazy aduino 움직이기
                Position NCA = crazyAduino.get(i); // nowCrazyAduino
                if(NCA.y == -1) continue;
                NCA.setMove(calcMove(NCA)); // 다음위치 계산
                move(NCA, 'R'); // 움직이기
            }
            merge();
            //모두움직이고, 폭발
            doExplode();
        }
    }

전체소스코드

https://github.com/devxb/JJUNalgo/blob/master/8972%20%EB%AF%B8%EC%B9%9C%20%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8/Main.java

 

devxb/JJUNalgo

백준 알고리즘 소스코드🙃. Contribute to devxb/JJUNalgo development by creating an account on GitHub.

github.com