12869번: 뮤탈리스크
1, 3, 2 순서대로 공격을 하면, 남은 체력은 (12-9, 10-1, 4-3) = (3, 9, 1)이다. 2, 1, 3 순서대로 공격을 하면, 남은 체력은 (0, 0, 0)이다.
www.acmicpc.net
알고리즘 : bfs / dp?
최소값 => bfs를 생각해서 bfs로 풀었다.
풀고나서 찾아보니 dp로도 많이 푸는 것 같긴한데 흠... 아직 잘 모르겠다.
경우의 수만큼 시도하면서 Layer를 파악하는 것이 핵심!
익숙하지 않아서 어려웠던 문제!
let input = require("fs")
.readFileSync("input.txt") //"/dev/stdin"
.toString()
.split("\n")
.map((val) => val.trim());
let n = +input.shift();
let scv = input
.shift()
.split(" ")
.map((v) => +v);
let arr = [
[9, 3, 1],
[9, 1, 3],
[3, 9, 1],
[3, 1, 9],
[1, 3, 9],
[1, 9, 3],
];
let vis = Array.from({ length: 61 }).map((_) => new Array(61).fill(0).map((__) => new Array(61).fill(0)));
const bfs = (start) => {
let queue = [];
vis[start[0]][start[1]][start[2]] = 1;
queue.push(start);
while (queue.length) {
let [c1, c2, c3] = queue.shift();
for (let i = 0; i < arr.length; i++) {
let n1 = Math.max(0, c1 - arr[i][0]);
let n2 = Math.max(0, c2 - arr[i][1]);
let n3 = Math.max(0, c3 - arr[i][2]);
if (vis[0][0][0]) break;
if (vis[n1][n2][n3]) continue;
vis[n1][n2][n3] = vis[c1][c2][c3] + 1;
queue.push([n1, n2, n3]);
}
}
return vis[0][0][0] - 1;
};
function solution() {
let ans = 0;
for (let i = 0; i < 3; i++) {
if (!scv[i]) scv[i] = 0;
}
ans = bfs(scv);
console.log(ans);
}
solution();
'코딩테스트(알고리즘) > baekjoon' 카테고리의 다른 글
[baekjoon] 12851 숨바꼭질2 (Javascript) (0) | 2023.02.03 |
---|---|
[baekjoon] 16637 괄호 추가하기 (Javascript) (1) | 2023.02.02 |
[baekjoon] 16234 인구 이동 (Javascript) (0) | 2023.01.31 |
[baekjoon] 2589 보물섬 (Javascript) (0) | 2023.01.30 |
[baekjoon] 15686 치킨 배달 (Javascript) (0) | 2023.01.29 |