Game Develop

[Algorithm] Programmers :: 양과 늑대 본문

Algorithm/Programmers

[Algorithm] Programmers :: 양과 늑대

MaxLevel 2023. 7. 24. 22:02

https://school.programmers.co.kr/learn/courses/30/lessons/92343

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
vector<vector<int>> graph(18);
int answer;
 
void DFS(int index, int sheepNum, int wolfNum, vector<int> nextNodes, vector<int>& info)
{
    if (info[index] == 0++sheepNum;
    else ++wolfNum;
 
    if (wolfNum >= sheepNum) return;
 
    answer = max(answer, sheepNum);
 
    for (int i = 0; i < nextNodes.size(); ++i)
    {
        vector<int> tempNextNodes = nextNodes;
        tempNextNodes.erase(tempNextNodes.begin() + i);
 
        for (int j = 0; j < graph[nextNodes[i]].size(); ++j)
        {
            tempNextNodes.push_back(graph[nextNodes[i]][j]);
        }
 
        DFS(nextNodes[i], sheepNum, wolfNum, tempNextNodes, info);
    }
}
 
 
int solution(vector<int> info, vector<vector<int>> edges) 
{
    answer = 0;
 
    for (int i = 0; i < edges.size(); ++i)
    {
        int a = edges[i][0];
        int b = edges[i][1];
 
        graph[a].push_back(b);
    }
 
    vector<int> nextNodes;
    for (int i = 0; i < graph[0].size(); ++i)
    {
        nextNodes.push_back(graph[0][i]);
    }
 
    DFS(000, nextNodes, info);
 
    return answer;
}
 
cs

완전탐색으로 풀이한 문제입니다.  방문가능한 정점을 (방문한 정점의 자식들)을 계속 갱신하면서 '복사'하는식으로 다음 재귀호출에 넘겨서 탐색하는 방식입니다.

이런식으로 풀어본적은 없어서 쉽게쉽게 풀지는 못했는데, 다음에 비슷한 문제를 풀때는 쉽게 풀 것 같습니다.

 

탐색하다가 막혔을 때(늑대의 수가 양의수 이상일 때), 일단 해당루트로는 탐색을 중지하긴해야하는데 나중에 다시 재탐색을 해야하는것을 어떻게 표현해야하는가?에 대한부분에서 조금 막혔던 것 같습니다.

사실 그렇게 어렵게 생각할것은 없고 그냥 컨테이너에 담아주면 됩니다(벡터든 큐든 뭐든).

그래서 각 정점을 탐색할 때 현재정점을 제외하고, 컨테이너에 현재정점의 자식들을 넣어준 후 그걸 다음 재귀호출에 사용하면 됩니다. 다만, 완전탐색이기 때문에 컨테이너는 복사로 넘겨줘야한다는 걸 명심해야 합니다.