ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฌธ์
๋ฌธ์ ํ์ด
๋ฌธ์ ์์ ๊ฒฉ์ํ๊ณผ ๊ถ์์ ๊ณต๊ฒฉ ๊ฑฐ๋ฆฌ ์ ํ D๊ฐ ์ฃผ์ด ์ง ๋ ์ ๊ฑฐํ ์ ์๋ ์ ์ ์ต๋ ์๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค. ๊ถ์๋ 3๋ช ์ ๋ฐฐ์นํ ์ ์์ผ๋ฉฐ, ๋ฐฐ์น ๊ฐ๋ฅํ ๋ฒ์๋ ์ด์ ๋ฒ์์ธ M๊น์ง ์ด๋ค.
๊ถ์์ ๊ฒฝ์ฐ 3๋ช ๋ง ๋ฐฐ์น ๊ฐ๋ฅํ๋ฏ๋ก ๊ฐ ์ขํ์ ๋ํด ์กฐํฉ(Combination)์ผ๋ก ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํด ํ๋ณด๊ตฐ์ ๊ตฌํ๋ค. ํ๋ณด๊ตฐ์ ๊ตฌํ์๋ค๋ฉด ํ๋ณด๊ตฐ์ ๋ชจ๋ ์ํํ๋ฉด์ ๊ณต๊ฒฉ ๊ฐ๋ฅํ ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ์ ์ ์ ๊ฑฐํ๊ณ ์ ์ด ์์ผ๋ก ์์ง์ด๋ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ ๊ฑฐํ ์ ์ ์๋ฅผ ๋น๊ตํ์ฌ ์ต๋ ๊ฐ์ ์ฐพ์ผ๋ฉด ๋๋ค. ๋ฌธ์ ๋ฅผ ๋ณด๊ณ , ์๊ฐํด๋๋ฐ ๊น์ง ์๊ฐ์ด ๊ฑธ๋ ธ์ผ๋ฉฐ ์ ์ ์ด๋์ํค๊ฑฐ๋ ํ๋ ๋ถ๋ถ์์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ์ฐธ์กฐํ์ฌ ํ์๋ค.
์ฝ๋
from sys import stdin
from copy import deepcopy
# combination
def dfs(cur_idx, depth):
global candidates
if cur_idx > M:
return
if len(check) == depth:
candidates.append([archer_position[idx] for idx in check])
return
for idx in range(cur_idx, M):
if idx in check:
continue
check.append(idx)
dfs(cur_idx + 1, depth)
check.pop()
def get_distance(cur_candidate):
ret = []
for position in cur_candidate:
temp = []
for y in range(N):
for x in range(M):
cur_distance = abs(position[0] - y) + abs(position[1] - x)
if cur_distance <= D:
temp.append((cur_distance, y, x))
ret.append(temp)
return ret
def forward_enemy():
return set((y + 1, x) for y, x in enemy if y + 1 < N)
def find_enemy(archer, cur_enemy):
# ๊ฑฐ๋ฆฌ์, ์ข์ธก์ ์๋ ์์ผ๋ก ์ ๋ ฌ
archer.sort(key=lambda x: (x[0], x[2]))
for dist, y, x in archer:
if (y, x) in cur_enemy:
return (y, x)
return None
if __name__ == '__main__':
answer = -1
N, M, D = map(int, stdin.readline().split())
enemy = set()
board = [[0 for _ in range(M)] for _ in range(N)]
# ์
๋ ฅ ๊ฐ ์ค 1์ ์ ์ด ์๋ ์์น
for y in range(N):
info = list(map(int, stdin.readline().split()))
for x in range(M):
if info[x]:
enemy.add((y, x))
check = []
archer_position = [(N, i) for i in range(M)]
candidates = []
dfs(0, 3)
for archers in candidates:
sum_kill = 0
cur_archer_distance = get_distance(archers)
origin_enemy = deepcopy(enemy)
while enemy:
cur_kill = set()
for cur_archer in cur_archer_distance:
kill = find_enemy(cur_archer, enemy)
if kill is not None:
cur_kill.add(kill)
sum_kill += len(cur_kill)
# ์ฃฝ์ ์ ๋ค์ ์ ์ธ
enemy -= cur_kill
enemy = forward_enemy()
# ๋ค์ ์กฐํฉ์ ์ํด ์๋๋๋ก ์ด๊ธฐํ
enemy = origin_enemy
answer = max(answer, sum_kill)
print(answer)
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 1106 ํธํ (0) | 2021.04.07 |
---|---|
๋ฐฑ์ค: 20056 ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ (0) | 2021.04.05 |
๋ฐฑ์ค: 2186 ๋ฌธ์ํ (0) | 2021.04.02 |
๋ฐฑ์ค: 20057 ๋ง๋ฒ์ฌ ์์ด์ ํ ๋ค์ด๋ (0) | 2021.03.31 |
๋ฐฑ์ค: 17140 ์ด์ฐจ์ ๋ฐฐ์ด๊ณผ ์ฐ์ฐ (0) | 2021.03.28 |