티스토리 뷰

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

 

17135번: 캐슬 디펜스

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

www.acmicpc.net

const fs = require("fs");
const input = fs
  .readFileSync("./dev/stdin")
  .toString()
  .trim()
  .split("\n")
  .map((v) => v.split(" ").map(Number));
const [N, M, D] = input.shift();

const board = input;
let max = 0;

const archers = [];

for (let i = 0; i < 1 << M; i++) {
  let j = i;
  let archer = [];
  let cnt = 0;
  while (j > 0) {
    if (j & 1) {
      archer.push(cnt);
    }
    cnt++;
    j = j >> 1;
  }
  if (archer.length == 3) {
    archers.push(archer);
  }
}

const enemySort = (a, b) => {
  if (a[2] > b[2]) return 1;
  else if (a[2] < b[2]) return -1;
  else {
    return a[1] - b[1];
  }
};

archers.forEach((group) => {
  let field = board.map((v) => [...v]).reverse();
  let cnt = 0;

  for (let i = 0; i < N; i++) {
    // kill
    const temp = [];
    group.forEach((a) => {
      const enemy = [];
      for (let x = 1; x <= D; x++) {
        for (let y = a - D + x; y < a + D - x + 1; y++) {
          if (x - 1 < 0 || y < 0 || x - 1 >= N || y >= M) continue;
          if (field[x - 1][y] == 1) {
            const dist = x + Math.abs(a - y);
            enemy.push([x - 1, y, dist]);
          }
        }
      }
      if (enemy.length > 0) {
        const [ex, ey] = enemy.sort(enemySort)[0];
        temp.push(JSON.stringify([ex, ey]));
      }
    });
    const target = [...new Set(temp)].map((v) => JSON.parse(v));
    target.forEach((v) => {
      const [tx, ty] = v;
      field[tx][ty] = 0;
      cnt++;
    });

    //move
    field.shift();
    field.push(new Array(M).fill(0));
  }
  max = Math.max(max, cnt);
});

console.log(max);
728x90

'자료구조 알고리즘' 카테고리의 다른 글

[프로그래머스] N개의 최소공배수  (0) 2021.05.20
[프로그래머스] 소수 만들기  (0) 2021.05.20
[java script] 순열  (0) 2021.05.20
[java script] 조합  (0) 2021.05.20
[java script] 부분집합 만들기.  (1) 2021.05.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함