문제
캐슬 디펜스는 성을 향해 몰려오는 적을 잡는 턴 방식의 게임이다. 게임이 진행되는 곳은 크기가 N×M인 격자판으로 나타낼 수 있다. 격자판은 1×1 크기의 칸으로 나누어져 있고, 각 칸에 포함된 적의 수는 최대 하나이다. 격자판의 N번행의 바로 아래(N+1번 행)의 모든 칸에는 성이 있다.
성을 적에게서 지키기 위해 궁수 3명을 배치하려고 한다. 궁수는 성이 있는 칸에 배치할 수 있고, 하나의 칸에는 최대 1명의 궁수만 있을 수 있다. 각각의 턴마다 궁수는 적 하나를 공격할 수 있고, 모든 궁수는 동시에 공격한다. 궁수가 공격하는 적은 거리가 D이하인 적 중에서 가장 가까운 적이고, 그러한 적이 여럿일 경우에는 가장 왼쪽에 있는 적을 공격한다. 같은 적이 여러 궁수에게 공격당할 수 있다. 공격받은 적은 게임에서 제외된다. 궁수의 공격이 끝나면, 적이 이동한다. 적은 아래로 한 칸 이동하며, 성이 있는 칸으로 이동한 경우에는 게임에서 제외된다. 모든 적이 격자판에서 제외되면 게임이 끝난다.
게임 설명에서 보다시피 궁수를 배치한 이후의 게임 진행은 정해져있다. 따라서, 이 게임은 궁수의 위치가 중요하다. 격자판의 상태가 주어졌을 때, 궁수의 공격으로 제거할 수 있는 적의 최대 수를 계산해보자.
격자판의 두 위치 (r1, c1), (r2, c2)의 거리는 |r1-r2| + |c1-c2|이다.
입력
첫째 줄에 격자판 행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가 주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다.
5 5 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 1 1 1
출력
첫째 줄에 궁수의 공격으로 제거할 수 있는 적의 최대 수를 출력한다.
3
이 문제도 삼성 A형 기출문제다.
아까 푼 파이프 옮기기에 비해 난이도가 크게 어렵지는 않았지만
생각해야하는 조건이 까다로웠다.
문제를 다 풀었다고 생각해도 계속 생각지 못한 반례가 튀어나와서 애를 좀 먹었다.
풀이 방법은 금방 생각해냈지만 구현하고 반례를 처리하다 보니
실제로 맞았습니다를 보는데에는 3시간 정도 걸린 것 같다.
백준 사이트에 올라온 반례를 많이 참고했기 때문에 아마 실전이었으면 못 풀었을 것이다.
우선 궁수 3명을 놓을 수 있는 자리를 찾기 위해서 DFS를 사용했다.
이때 가능한 경우의 수는 총 C(n,3)이다.
이후 하나의 경우의 수 마다 몇 명의 적을 쓰러뜨릴 수 있는지 확인했다.
이때 4중 for문이라서 코드를 작성하면서도 긴가민가 했지만 N의 수가 적어서 괜찮은 듯했다.
각 궁수마다 가장 가까운 적을 찾아서 한번에 처리해주었다.
한번에 처리하지 않으면 문제가 생겼었다.
후기)
for문이 많으니까 좀 헷갈렸다.
원래 코드에서 반례를 처리하기 위해서 코드가 자꾸 덕지덕지 더러워질 땐
그냥 다 지웠다가 다시 작성하는게 훨씬 편한 길인 것 같다.
구현 문제가 재미있긴한데 반례가 자꾸 튀어나오면 화가 난다.
'PS > 백준' 카테고리의 다른 글
[BOJ] 14501 퇴사 (0) | 2022.01.17 |
---|---|
[BOJ] 17136 색종이 붙이기 (0) | 2022.01.16 |
[BOJ] 17070 파이프 옮기기 1 (0) | 2022.01.14 |
[BOJ] 16337 괄호 추가하기 (2) | 2022.01.13 |
[BOJ] 3015 오아시스 재결합 (0) | 2022.01.13 |