https://programmers.co.kr/learn/courses/30/lessons/92343
코딩테스트 연습 - 양과 늑대
[0,0,1,1,1,0,1,0,1,0,1,1] [[0,1],[1,2],[1,4],[0,8],[8,7],[9,10],[9,11],[4,3],[6,5],[4,6],[8,9]] 5 [0,1,0,1,1,0,1,0,0,1,0] [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6],[3,7],[4,8],[6,9],[9,10]] 5
programmers.co.kr
[난이도] level3
[유형] 완전탐색
[풀이]
총 노드의 개수가 최대 17개밖에 되지 않기 때문에 방문할 수 있는 모든 경우의 수를 다해봐도 문제 해결이 가능합니다.
void sol(int n,set<int> s,int a,int b) 이라는 재귀함수를 만들어서 아래와 같이 정의하였습니다.
n : 현재 방문한 노드,
s : 다음에 방문할 수 있는 노드,
a : 현재 같이있는 양의 수,
b : 현재 같이있는 늑대의 수
현재 방문한 노드의 자식 노드들을 s에 추가해준 줍니다.
그러면 이제 s에 들어있는 노드들은 다음에 방문할 수 있는 모든 노드가 들어있게 됩니다.
s에 들어있는 노드들을 순차적으로 방문하는 재귀함수를 호출해주면서 a , b 값을 누적해가면
최댓값을 구할 수 있습니다.
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
int N,ans;
vector<int> adj[17],info;
void sol(int n,set<int> s,int a,int b){
if(info[n]) b++;
else a++;
if(b>=a) return;
s.erase(n);
ans=max(a,ans);
for(auto nxt : adj[n]) s.insert(nxt);
for(auto v : s) sol(v,s,a,b);
}
int solution(vector<int> _info, vector<vector<int>> edges) {
N=info.size();
info=_info;
for(auto eg : edges) adj[eg[0]].push_back(eg[1]);
sol(0,{0},0,0);
return ans;
}
https://github.com/has2/Problem-Solving/blob/master/programmers/level3/양과_늑대.cpp
'Problem-Solving > Programmers' 카테고리의 다른 글
[프로그래머스][level3] 사라지는 발판 (C++) (0) | 2022.05.29 |
---|---|
[프로그래머스][level3] 파괴되지 않은 건물 (C++) (0) | 2022.05.29 |
[프로그래머스][level2] 주차 요금 계산 (C++) (0) | 2022.05.29 |
[프로그래머스][level2] k진수에서 소수 개수 구하기 (C++) (0) | 2022.05.29 |
[프로그래머스][level2] 양궁대회 (C++) (0) | 2022.05.29 |