데브허브 | DEVHUB | Maximum Number of K-Divisible Components - Leetcode 2872 - PythonMaximum Number of K-Divisible Components - Leetcode 2872 - Python
- 문제는 무방향 그래프로 주어지지만, 사이클이 없는 '트리'라는 점을 활용하여 DFS 기반의 효율적인 해결이 가능합니다. 🌳
- 전체 트리의 모든 노드 값의 합은 K로 나누어 떨어짐이 보장됩니다. 이는 부분 트리가 K로 나누어 떨어지면, 나머지 부분도 K로 나누어 떨어진다는 중요한 단서가 됩니다. ➕
- 임의의 노드를 루트로 설정하고, 자식 노드로부터 부모 노드로 합을 전달하는 하향식(bottom-up) DFS를 사용합니다. ⬇️⬆️
- 각 DFS 호출은 현재 노드와 그 자손 노드들의 값 합계를 계산하며, 이는 재귀적으로 자식 노드의 DFS 결과를 합산하여 이루어집니다. 🔢
- 무방향 그래프에서 부모 노드로 다시 돌아가는 것을 방지하기 위해 DFS 호출 시 현재 노드의 '부모'를 인자로 전달하여 방문을 제한합니다. 🚫🔄
- 특정 부분 트리의 총합이 K로 나누어 떨어지면, 해당 부분 트리는 하나의 유효한 K-나눔 컴포넌트가 되며, 이 경우 결과 카운트를 증가시킵니다. ✅
- K로 나누어 떨어지는 부분 트리가 발견되면, 해당 부분 트리는 독립적인 컴포넌트로 간주하고, 그 부모에게는 '0'을 반환합니다. 이는 해당 컴포넌트가 더 이상 상위 컴포넌트의 K-나눔 여부에 영향을 주지 않음을 의미합니다. ✂️
- 이 접근 방식은 귀류법(proof by contradiction)을 통해 정당화됩니다. K로 나누어 떨어지지 않는 부분은 반드시 상위 노드와 결합해야 하며, K로 나누어 떨어지는 부분은 독립적으로 분리될 수 있습니다. 💡