https://school.programmers.co.kr/learn/courses/30/lessons/133500#
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
트리이므로 싸이클이 없으며 모든 노드는 연결되어 있고 노드가 n개 있을 때 엣지의 수는 n-1이다.
따라서 하나의 노드를 루트 노드로 잡고 리프 노드까지 내려간다. 이후 리프 노드에 대해서는 리프든, 부모든 무조건 한 곳을 켜줘야 한다. 이 때 부모는 여러 리프를 가질 수 있으므로 부모 쪽을 키는 게 이득이다.
또한 리프와의 관계가 아닐 시에는 자식 노드가 켜져있는지 보고 만약 자식 모두가 켜져있는 게 아니면 부모 노드를 켜줘야 한다.
처음엔 부모와 자식들 간에서 자식 중에 하나라도 켜져 있으면 부모를 안 켜도 되는지 알았는데 각각 관계를 따져서 만약 하나의 자식이라도 안 켜져 있으면 부모를 켜줘야 한다.
#include <vector>
using namespace std;
vector<int> edge[100001];
int numCount=0;
//2은 리프노드, 1는 켜진 상태, 0은 꺼진 상태
int dfs(int parent, int node){
if(parent!=0&&edge[node].size()==1) return 2;
bool isOn = false;
bool hasLeaf = false;
for(int i = 0; i<edge[node].size(); i++){
if(edge[node][i]==parent){
continue;
}
int val = dfs(node, edge[node][i]);
if(val==2){
hasLeaf=true;
}else if(val==0){
isOn=true;
}
}
if(hasLeaf||isOn) {
numCount++;
return 1;
}else{
return 0;
}
}
int solution(int n, vector<vector<int>> lighthouse) {
int answer = 0;
for(int i = 0 ; i<lighthouse.size(); i++){
edge[lighthouse[i][0]].push_back(lighthouse[i][1]);
edge[lighthouse[i][1]].push_back(lighthouse[i][0]);
}
dfs(0, 1);
answer = numCount;
return answer;
}
'코딩테스트 > C++' 카테고리의 다른 글
[프로그래머스 Level 3] 주사위 고르기 (C++) (0) | 2024.12.08 |
---|---|
[프로그래머스 Level 3] 억억단을 외우자 (C++) (0) | 2024.12.02 |
[프로그래머스 Level 3] 최적의 행렬 곱셈 (C++) (0) | 2024.11.22 |
[프로그래머스 Level 3] 카운트 다운 (C++) (0) | 2024.11.20 |
[프로그래머스 Level 3] 아이템 줍기 (C++) (0) | 2024.11.17 |