문제풀이/백트래킹
[Javascript/자바스크립트] (프로그래머스) 양과 늑대
딜레이레이
2025. 5. 9. 23:28
https://school.programmers.co.kr/learn/courses/30/lessons/92343
코드
function solution(info, edges) {
let answer = 0;
const n = info.length;
const graph = Array.from(new Array(n), () => []);
for (const [a, b] of edges) {
graph[a].push(b);
}
const visited = new Array(n).fill(false);
const bt = (sheep, wolf) => {
answer = Math.max(answer, sheep);
for (const [s, e] of edges) {
if (visited[s] && !visited[e]) {
if (info[e] === 0) {
visited[e] = true;
bt(sheep + 1, wolf);
visited[e] = false;
} else if (info[e] === 1 && sheep > wolf + 1) {
visited[e] = true;
bt(sheep, wolf + 1);
visited[e] = false;
}
}
}
};
visited[0] = true;
bt(1, 0);
return answer;
}
`bt()`를 재귀적으로 수행하며 노드를 하나씩 방문하는 풀이이다. 다만, 방문한 노드를 다시 방문할 수 있다는 점을 유의해야 한다.
방문할 노드를 고를 때는 다음과 같은 기준을 만족해야 한다.
- 현재 방문한 노드들에서 도달할 수 있어야 한다. (`visited[s]`)
- 아직 방문하지 않은 노드로 가는 것이어야 한다. (`!visited[e]`)
- 해당 노드에 방문했을 때 양의 마릿수가 늑대 마릿수보다 많아야 한다.
문제를 이리저리 생각해봐도 해결방법이 잘 떠오르지 않아서 구글링을 해본 문제였는데, 이 풀이의 접근방법이 내가 접근했던 방향과 완전 다른 느낌이라서 갖고 왔다.
`bt()`가 한 번 실행될 때마다 하나의 간선을 추가하는 듯한 풀이 방법이 보면 마치 크루스칼 알고리즘 같기도 하다. 그렇지만 간선의 가중치를 정렬한다거나 하는 과정도 없고, MST를 구하는 것이 목적이 아니기 때문에 이건 크루스칼은 아니다.