[C++] 백준 20056 - 마법사 상어와 파이어볼

🔐 백준 20056 - 마법사 상어와 파이어볼

https://www.acmicpc.net/problem/20056


🔑 풀이

파이어볼은 좌표(x, y), 질량, 방향, 속력의 5가지를 가지며, 이를 저장하기 위해

class 혹은 struct를 사용할 수 있다. 또한, 2차원 격자에 파이어볼이 위치할 수 있으므로

파이어볼들을 담을 수 있도록 vector를 담는 2차원 배열 board를 사용한다. 또한 따로 현재 존재하는

파이어볼들을 저장할 ball 배열을 사용한다.

파이어볼에게 이동 명령을 내렸을 때, 일어나는 과정은 다음과 같다.

1. 모든 파이어볼이 자신의 방향으로 속력 만큼 이동

2. 이동이 끝난 후 2개 이상의 파이어볼이 존재하는 칸에서는 다음과 같은 일이 발생

    2-1. 파이어볼이 모두 합쳐진다.
    2-2. 합쳐진 파이어볼은 4개의 파이어볼로 나누어진다.
    2-3. 합쳐진 파이어볼의 방향들이 모두 홀수 or 짝수였다면 4개의 파이어볼의 각각의 방향은
         0, 2, 4, 6 이 되며, 아닌 경우 1, 3, 5, 7이 된다. (4개의 파이어볼의 방향을 정해줌)
    2-4. 질량이 0인 파이어볼은 사라진다.

3. 이 과정을 k번 반복한다.

이런 시뮬레이션 문제의 경우 문제를 정확히 파악하고, 각각의 문제 조건에 맞도록 차근차근 구현하는 것이

중요하다. 또한 특별한 알고리즘을 아는 것이 중요하지는 않지만, 구현을 할 때 신경써야 할 부분이 많기

때문에 침착하게 모든 문제 조건을 만족하도록 코딩하는 것이 중요한 것 같다. 이 문제에서는 크게 다음의

조건들을 조심해야 했다.

1. 1번 행, 열이 N번 행, 열과 연결되어 있다.

2. 파이어볼이 이동한 후 2개 이상의 파이어볼이 합쳐질 때, 각각의 방향을 어떻게 파악하여 다음
   나누어지는 파이어볼의 방향을 정할 것인가.

3. 이동이 끝난 이후, 각 칸의 파이어볼이 합쳐지고 나눠지는 과정에서 어떻게 격자에 표현할 것인가.


🧩 코드

Categories:

Updated:

Leave a comment