과정
1. slide_down 함수를 통해서 보드를 아래로 내림
2. is_finished 함수를 통해서 보드에서 적들이 다 사라졌는지 확인
3. original에 기존 보드를 저장해두고 combination을 이용해서 궁수들의 자리를 조합
4. 매 조합마다 아래 반복
- 무한루프를 돌며 is_finished로 끝났을 때 종료
- 각 아처의 position마다 공격 가능한 좌표를 possible_atack에 저장
- 그 possible_atack을 최단거리, 왼쪽 우선 순으로 정렬
- possible_attack중에서 board[x][y]==1인 것을 찾으면 shoot리스트에 좌표를 추가하고 바로 종료
-> 궁수들이 똑같은 것을 쏠수도 있기때문에 우선 shoot에 저장, 그리고 한발만쏘기때문에 바로 종료- shoot에 중복된 것을 제거하기 위해 list(set(shoot))
- shoot에 들어있는 좌표들의 board[x][y]=0으로 만들고 ans (기록) +=1
- result.append(ans)
from itertools import combinations
import copy
def slide_down():
global board
temp=[[0 for i in range(m)]]
for i in range(n):
if i==n-1:
break
temp.append(board[i])
board=temp
def is_finished():
global board
for b in board:
if 1 in b:
return False
return True
n,m,d = map(int,input().split())
global board
board=[]
for i in range(n):
board.append(list(map(int,input().split())))
original = copy.deepcopy(board)
archor = [i for i in range(m)]
coms = combinations(archor,3)
result=[]
for com in coms:
board=copy.deepcopy(original)
position = [(n,com[0]),(n,com[1]),(n,com[2])]
ans=0
while True:
if is_finished():
break
shoot=[]
for x,y in position:
possible_attack=[]
for i in range(n):
for j in range(m):
z = abs(i-x)+abs(j-y)
if z<=d:
possible_attack.append((i,j,z))
possible_attack.sort(key=lambda x:(x[2],x[1],-1*x[0]))
for x,y,z in possible_attack:
if board[x][y]==1:
shoot.append((x,y))
break
shoot=list(set(shoot))
for x,y in shoot:
board[x][y]=0
ans+=1
slide_down()
result.append(ans)
print(max(result))
time:30분