Problem Solving/백준

[삼성 A형 기출문제] - 17135 캐슬 디펜스

돌돌김 2020. 3. 1. 22:12

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

 

17135번: 캐슬 디펜스

첫째 줄에 격자판 행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가 주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다.

www.acmicpc.net

 

처음에 문제의 조건을 꼼꼼하게 읽지 않아서 시간을 많이썼다. 시간을 많이 쓴부분은 다음과 같다.

  1. 궁수는 성에만 위치해야 한다.
  2. 궁수는 가장 가까운 거리의 적을 먼저 쏘고, 그 거리가 같은 적이 2명 이상이면, 가장 왼쪽의 적을 쏜다.

또한, 문제를 풀면서 궁수의 위치를 큐에 담아서 pop()을 하는 방식으로 다음 궁수의 행동을 하게했는데, 이렇게 하면 안됐었다. 이부분이 가장 시간을 많이 잡아 먹었다.

 

 

구현 순서

  1. 적인지, 벽인지 (1인지, 0인지) 과 함께, 적의 생존여부를 파악하기 위해 구조체로 만든 배열에 입력을 받는다
  2. 3명의 궁수가 서있는 위치 구현(dfs를 사용하여 조합을 만든다) n이 작고, 궁수는 3명이므로 next_permutation도 가능하다.
  3. 처음 입력 받은 배열(map)은 게임이 진행되면서 값이 계속 바뀌므로, backup에 카피하여 backup에서 궁수, 적의 행동을 하게한다.
  4. 궁수의 위치(my_archer)에서 적 위치와의 거리를 계산한다. 그 거리가 사거리 이하이면, 큐(enemy)에 넣는다.
  5. 적과의 거리가 짧은 순, 적과의 거리가 같다면 가장 왼쪽의 적부터 처리해야하는 조건에 의해 사용자 정의 함수를 만들어 큐(enemy)를 정렬한다
    1. 이 때, 2명 이상의 궁수가 같은 적을 공격할 수 있다. 그렇게 때문에 적을 게임에서 바로 아웃시키지 않고, 적의 상태를 죽은것으로 표시해준다.
    2. 죽은 적은 나중에 궁수의 행동이 모두 끝난 뒤, 게임에서 제거해야 하므로 dead_enemy 라는 큐에 위치를 저장한다.
    3. 살아있는 적을 죽이면 kill 값을 1 증가한다.
  6. 죽은 적을 게임에서 제외하기 위해 dead_enemy의 원소들을 하나씩 꺼내며 배열에서 없앤다.
  7. 적들은 한 칸씩 아래로 움직이므로 밑으로 움직여준다.
    1. 가장 아래(n-1)부터 움직여야 한다.

 

 

소스코드