- 재귀 dfs 탐색 능력을 키우는 게 먼저인 거 같음
Solution
Python
from typing import List
def solution(info: List[int], edges: List[List[int]]) -> int:
ROOT_INDEX = 0
SHEEP_NUMBER = 0
WOLF_NUMBER = 1
NOT_VISITED_NUMBER = 0
VISITED_NUMBER = 1
answer = []
visited = [NOT_VISITED_NUMBER] * len(info)
def dfs(sheep, wolf):
if sheep <= wolf:
return
answer.append(sheep)
# edges의 각 행은 [부모 노드 번호, 자식 노드 번호] 형태
for parent_node, child_node in edges:
# 부모 노드가 방문된 상태, 자식 노드가 방문되지 않은 상태 -> 이래야 중복 방문을 피할 수 있음
if visited[parent_node] and not visited[child_node]:
visited[child_node] = VISITED_NUMBER
if info[child_node] == SHEEP_NUMBER:
dfs(sheep + 1, wolf)
elif info[child_node] == WOLF_NUMBER:
dfs(sheep, wolf + 1)
visited[child_node] = NOT_VISITED_NUMBER
visited[ROOT_INDEX] = VISITED_NUMBER
# 0번 노드(루트 노드)에는 항상 양이 있음 (늑대는 없음)
dfs(1, 0)
return max(answer)
- answer가
List<Integer>
였다면 answer에 계속 add를 해가면서 마지막에 max 값을 구하면 됐지만, int[]
형일 경우는 무한대로 배열을 못 늘리니, 하나짜리로 생성 후 max의 값을 계속 갱신해주는 방식으로 해줄 수 있음
Java
package programmers.sully.week39;
public class SheepAndWolf {
private static final int ROOT_INDEX = 0;
private static final int SHEEP_NUMBER = 0;
private static final int WOLF_NUMBER = 1;
private static final int NOT_VISITED_NUMBER = 0;
private static final int VISITED_NUMBER = 1;
public int solution(int[] info, int[][] edges) {
int[] answer = new int[1];
int[] visited = new int[info.length];
dfs(1, 0, info, edges, answer, visited);
return answer[0];
}
private void dfs(int sheep, int wolf, int[] info, int[][] edges, int[] answer, int[] visited) {
if (sheep <= wolf) {
return;
}
answer[0] = Math.max(answer[0], sheep);
visited[ROOT_INDEX] = VISITED_NUMBER;
for (int[] edge : edges) {
int parent_node = edge[0];
int child_node = edge[1];
if (visited[parent_node] == VISITED_NUMBER && visited[child_node] == NOT_VISITED_NUMBER) {
visited[child_node] = VISITED_NUMBER;
if (info[child_node] == SHEEP_NUMBER) {
dfs(sheep + 1, wolf, info, edges, answer, visited);
} else if (info[child_node] == WOLF_NUMBER) {
dfs(sheep, wolf + 1, info, edges, answer, visited);
}
visited[child_node] = NOT_VISITED_NUMBER;
}
}
}
}
Reference
Leave a comment