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를 구하는 것이 목적이 아니기 때문에 이건 크루스칼은 아니다.
'문제풀이 > 백트래킹' 카테고리의 다른 글
| [Python/파이썬] 백준 22953번 도도의 음식 준비 (3) | 2025.06.02 |
|---|---|
| [Javascript/자바스크립트] (프로그래머스) 불량 사용자 (0) | 2025.05.04 |
| [Python/파이썬] 백준 14650번 걷다보니 신천역 삼 (Small) (0) | 2025.04.26 |
| [Python/파이썬] 백준 2057번 팩토리얼 분해 (0) | 2025.04.07 |
| [Python/파이썬] 백준 25369번 카드 숫자 곱을 최소로 만들기 (0) | 2025.04.02 |