Koala - 7기/코딩테스트 준비 스터디
[백준/python] 17135 캐슬 디펜스
sheeeep
2022. 7. 24. 16:03
https://www.acmicpc.net/problem/17135
17135번: 캐슬 디펜스
첫째 줄에 격자판 행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가 주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다.
www.acmicpc.net
코드
##17135 캐슬_디펜스
import copy
from itertools import combinations as cm
n, m, d = map(int, input().split())
enemies = []
for _ in range(n):
row = list(map(int, input().split()))
enemies.append(row)
distance = -1
if d <= n:
distance = n-1-d
com = [i for i in range(m)]
combinations = list(cm(com, 3))
answer = 0
for combi in combinations:
kill = 0
enemy = copy.deepcopy(enemies)
done = False
for _ in range(n):
shoot = []
for archer in combi:
minDis = d
minJ = m
minI = n
for i in range(n-1, distance, -1):
for j in range(m):
if enemy[i][j] == 1 and abs(i-n) + abs(j-archer) <= minDis:
if abs(i-n) + abs(j-archer) < minDis:
minJ = j
minI = i
minDis = abs(i-n) + abs(j-archer)
else:
if j < minJ:
minJ = j
minI = i
minDis = abs(i - n) + abs(j - archer)
if minJ != m:
shoot.append((minI, minJ))
if len(shoot) > 0:
shoot = list(set(shoot))
for k in shoot:
enemy[k[0]][k[1]] = 0
kill += 1
enemy = [[0 for _ in range(m)]] + (enemy[0:n-1])
answer = max(answer, kill)
print(answer)
문제풀이
1. 0 ~ n-1 자리의 궁수 3명의 배치를 구한다(조합)
2. 각 조합별로 문제에서 주어진 조건을 만족시키며 턴을 모두 진행한다.
3.문제 진행중 적을 바로 죽이는 것이 아닌, 모든 경우를 탐색해 가장 짧은 거리, 가장 왼쪽의 조건을 순서대로 만족시키는 ij를 찾은 후 적을 죽인다.
4. 각 조합별로 죽일 수 있는 적의 최대 수를 갱신한 뒤, 반환한다.