PROGRAMMERS 프로그래머스 : 양과 늑대
Updated:
시작하면서
이번 문제는 깊이 우선 탐색(DFS/BFS) 문제이다.
문제 아이디어
이 문제는 노드의 최대 수가 17밖에 안되므로 깊이/너비 우선 탐색 둘 중 아무거나 사용해서 풀 수 있다. 방법은 다음과 같다.
- 노드에서 어느 방향으로 가든지 먼 노드로 이동하는데 비용이 따로 들지 않으므로, 방문한 노드들을 하나로 합쳐서 생각한다.
- 이를 나타내기 위해 nextNodes에 현재 방문 가능한 노드들을 계속해서 업데이트 한다.
- 방문할 수 있는 노드들을 방문하면서 양/늑대의 개수를 세어준다.
- 이때, 양의 수와 늑대의 수가 같아지면 더 이상 방문할 수 없으므로 방문하지 않는다.
- 가능한 모든 경우를 해보고 최대 양의 개수를 출력한다.
해결
#include <string>
#include <vector>
#include <queue>
#include <math.h>
using namespace std;
#define SHEEP (0)
#define WOLF (1)
struct Information
{
vector<int> nextNodes;
int sheepCount;
int wolfCount;
};
int solution(vector<int> info, vector<vector<int>> edges)
{
vector<vector<int>> graph(info.size());
for (int i = 0; i < edges.size(); i++)
{
graph[edges[i][0]].push_back(edges[i][1]);
}
queue<Information> q;
q.push({ graph[0], 1 ,0 });
int answer = 0;
while (q.empty() == false)
{
Information currentInformation = q.front();
q.pop();
answer = max(answer, currentInformation.sheepCount);
int differenceBetweenSheepAndWolves = currentInformation.sheepCount - currentInformation.wolfCount;
for (int i = 0; i < currentInformation.nextNodes.size(); i++)
{
int nextNode = currentInformation.nextNodes[i];
if (info[nextNode] == WOLF && differenceBetweenSheepAndWolves == 1)
continue;
vector<int> nextNodes;
for (int j = 0; j < currentInformation.nextNodes.size(); j++)
{
if (i == j)
continue;
nextNodes.push_back(currentInformation.nextNodes[j]);
}
for (int j = 0; j < graph[nextNode].size(); j++)
{
nextNodes.push_back(graph[nextNode][j]);
}
int nextSheepCount = currentInformation.sheepCount, nextWolfCount = currentInformation.wolfCount;
if (info[nextNode] == WOLF)
{
nextWolfCount++;
}
else
{
nextSheepCount++;
}
q.push({ nextNodes, nextSheepCount, nextWolfCount});
}
}
return answer;
}
Leave a comment