problem-17135

ysysc·2023년 2월 26일
0

PS

목록 보기
44/47

과정
1. slide_down 함수를 통해서 보드를 아래로 내림
2. is_finished 함수를 통해서 보드에서 적들이 다 사라졌는지 확인
3. original에 기존 보드를 저장해두고 combination을 이용해서 궁수들의 자리를 조합
4. 매 조합마다 아래 반복

  1. 무한루프를 돌며 is_finished로 끝났을 때 종료
  2. 각 아처의 position마다 공격 가능한 좌표를 possible_atack에 저장
  3. 그 possible_atack을 최단거리, 왼쪽 우선 순으로 정렬
  4. possible_attack중에서 board[x][y]==1인 것을 찾으면 shoot리스트에 좌표를 추가하고 바로 종료
    -> 궁수들이 똑같은 것을 쏠수도 있기때문에 우선 shoot에 저장, 그리고 한발만쏘기때문에 바로 종료
  5. shoot에 중복된 것을 제거하기 위해 list(set(shoot))
  6. shoot에 들어있는 좌표들의 board[x][y]=0으로 만들고 ans (기록) +=1
  7. result.append(ans)
  1. 마지막에 result 중 가장 큰 값을 출력 -> 가장 많은 적을 사살
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분

0개의 댓글