title: "[프로그래머스] 등대 Python 파이썬 해설 (Level 3) - 이도훈"
cleanUrl: "programmers/133500"
description: "프로그래머스 Level 3 문제 [등대]의 풀이를 정리합니다."

문제 설명 및 제한사항

문제 설명

인천 앞바다에는 1부터 n까지 서로 다른 번호가 매겨진 등대 n개가 존재합니다. 등대와 등대 사이를 오가는 뱃길이 n-1개 존재하여, 어느 등대에서 출발해도 다른 모든 등대까지 이동할 수 있습니다. 등대 관리자 윤성이는 전력을 아끼기 위하여, 이 중 몇 개의 등대만 켜 두려고 합니다. 하지만 등대를 아무렇게나 꺼버리면, 뱃길을 오가는 배들이 위험할 수 있습니다. 한 뱃길의 양쪽 끝 등대 중 적어도 하나는 켜져 있도록 등대를 켜 두어야 합니다.

예를 들어, 아래 그림과 같이 등대 8개와 7개의 뱃길들이 있다고 합시다. 이 경우 1번 등대와 5번 등대 두 개만 켜 두어도 모든 뱃길은 양쪽 끝 등대 중 하나가 켜져 있으므로, 배들은 안전하게 운항할 수 있습니다.

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/f8f83817-2d81-41ec-ab2f-64b19abf7dfb/image7_1.PNG

등대의 개수 n과 각 뱃길이 연결된 등대의 번호를 담은 이차원 배열 lighthouse가 매개변수로 주어집니다. 윤성이가 켜 두어야 하는 등대 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

제한사항

아이디어 및 해결 방법

정답 상황에서, 어떤 노드 하나는 꺼지거나 켜지거나 둘 중 하나일 겁니다. 그러면 문제를 분할해서, 자신을 포함한 서브트리에서 그 노드가 켜졌을 때의 최소 점등 등대 개수(on)와, 그 노드가 꺼졌을 때의 최소 점등 등대 개수(off)를 구해서 둘 중 작은 것을 답으로 내놓는다고 생각해 봅시다. 이걸 루트 노드에 대해서 구하면 정답이 될 겁니다.

on, off 값을 구하기 위해서, 어떤 노드와 그 자식 노드와의 관계성을 생각해볼 수 있습니다.

해당 노드가 켜졌을 때, 그 노드를 포함한 서브트리의 최소 점등 등대 개수(on)

어떤 노드가 켜져있다면, 자식 노드는 켜져 있든말든 상관 없습니다. 따라서 자식노드를 루트 노드로 하는 DFS로 얻은 child_on, child_off 값중 작은 값을 골라서 합쳐 줍니다.

해당 노드가 꺼졌을 때, 그 노드를 포함한 서브트리의 최소 점등 등대 개수(off)

어떤 노드가 꺼져 있다면, 자식 노드는 무조건 켜져있어야 합니다. 따라서 자식 노드의 child_on 값만 취하여 합쳐 줍니다.