π λ¬Έμ λ§ν¬
μκ³Ό λλ
μ½λ©ν
μ€νΈ μ°μ΅ - μκ³Ό λλ λ¬Έμ μ
λλ€.
π‘ λ¬Έμ νμ
- μ΄μ§ νΈλ¦¬μ κ° λ
Έλμλ μ(
0) λλ λλ(1)κ° μκ³ , 루νΈ(0λ² λ Έλ)μμ μμν©λλ€. 루νΈλ νμ μμ λλ€. - λΆλͺ¨ λ Έλλ₯Ό λ°©λ¬Έν μνμμλ§ μμ λ Έλλ‘ μ΄λν μ μκ³ , μ΄λν λ Έλμ μ/λλκ° μΌνμ μΆκ°λ©λλ€.
- λλμ μκ° μμ μ μ΄μμ΄ λλ©΄ μμ΄ λͺ¨λ μ‘μλ¨Ήνλ―λ‘ κ·Έ μνλ νμ©λμ§ μμ΅λλ€.
- λλμκ² μ‘μλ¨Ήνμ§ μκ³ λͺ¨μ μ μλ μμ μ΅λ μλ₯Ό ꡬν©λλ€.
- λ Έλλ μ΅λ 17κ°λΌ μμ νμμ΄ κ°λ₯ν©λλ€.
ποΈ μ κ·Ό λ°©λ²
- λ¨μν μμ λ°©ν₯μΌλ‘λ§ λ΄λ €κ°λ DFS λ "μ§κΈμ λλκ° μμ΄μ λͺ» κ°μ§λ§, λ€λ₯Έ κ°μ§μμ μμ λ¨Όμ λͺ¨μΌκ³ μ€λ©΄ κ° μ μλ λ Έλ"λ₯Ό λμΉ©λλ€.
- κ·Έλμ νμ¬κΉμ§ λ°©λ¬Έν λ
Έλ μ§ν©μμ λ€μμ λ°©λ¬Έν μ μλ λͺ¨λ λ
Έλλ₯Ό νλ³΄λ‘ μΌλ λ°©μμΌλ‘ νμν©λλ€.
visited[]λ‘ λ°©λ¬Έν λ Έλλ₯Ό κΈ°λ‘ν©λλ€.- λͺ¨λ κ°μ
[parent, child]λ₯Ό μννλ©΄μvisited[parent] && !visited[child]μΈ κ°μ μ΄ κ³§ λ€μμ κ° μ μλ ν보μ λλ€.- λ
Έλλ‘ μ΄λνλ €λ©΄ λΆλͺ¨λ₯Ό μ΄λ―Έ λ°©λ¬Ένμ΄μΌ νκ³ (
visited[parent]), μμ§ λ°©λ¬Ένμ§ μμ λ Έλμ¬μΌ νκΈ°(!visited[child]) λλ¬Έμ λλ€. - νμ¬ λ Έλμ μμλ§ λ³΄λ κ² μλλΌ λ°©λ¬Έν λ Έλ μ 체μ λΆμ΄ μλ λ Έλλ₯Ό λͺ¨λ νλ³΄λ‘ λ³΄λ―λ‘, λ€λ₯Έ κ°μ§μμ μμ λ¨Όμ λͺ¨μ λ€ λμμ€λ κ²½μ°λ νμλ©λλ€.
- λ
Έλλ‘ μ΄λνλ €λ©΄ λΆλͺ¨λ₯Ό μ΄λ―Έ λ°©λ¬Ένμ΄μΌ νκ³ (
dfs(sheep, wolf)λ λ€μκ³Ό κ°μ΄ λμν©λλ€.wolf >= sheepμ΄λ©΄ μμ΄ μ‘μλ¨Ήνλ―λ‘ λ μ§ννμ§ μκ³ λ°νν©λλ€.- κ·Έλ μ§ μμΌλ©΄
answerλ₯ΌsheepμΌλ‘ κ°±μ ν©λλ€. - κ° μ μλ μμ λ
Έλλ₯Ό λ°©λ¬Έ μ²λ¦¬νκ³ , μμ΄λ©΄
sheep + 1, λλλ©΄wolf + 1λ‘ μ¬κ· νΈμΆν λ€ λ°±νΈλνΉμΌλ‘ λ°©λ¬Έμ λλ립λλ€.
- 루νΈλ νμ μμ΄λ―λ‘
visited[0] = trueλ‘ λκ³dfs(1, 0)μμ μμν©λλ€.
for (int[] edge : edges) {
int parent = edge[0];
int child = edge[1];
if (visited[parent] && !visited[child]) {
visited[child] = true;
if (info[child] == 0) dfs(sheep + 1, wolf); // μ
else dfs(sheep, wolf + 1); // λλ
visited[child] = false;
}
}
β±οΈ 볡μ‘λ λΆμ
μκ° λ³΅μ‘λ
- λ
Έλ μλ₯Ό
n(μ΅λ 17) μ΄λΌκ³ νλ©΄, ν λ²μdfsνΈμΆμ λͺ¨λ κ°μ μ ν λ²μ© νμΈνλ―λ‘O(n)μ λλ€. - νΈμΆ νμλ κ°λ₯ν λ°©λ¬Έ μμμ μμ λΉλ‘ν©λλ€. μ΄λ‘ μ μΈ μνμ
n!μ΄μ§λ§, μ΄μ§ νΈλ¦¬λΌ ν λ²μ κ° μ μλ νλ³΄κ° μ νλκ³wolf >= sheepμ΄ λλ κ°μ§λ λ°λ‘ μλ €μ μ€μ νμλμ ν¨μ¬ μ μ΅λλ€. κ·Έλμn β€ 17μμ ν΅κ³Όν©λλ€. - κ°μ λ°©λ¬Έ μ§ν©μ΄ λ€λ₯Έ μμλ‘ μ¬λ¬ λ² νμλ μ μμΌλ―λ‘, λ μμ νκ² νλ €λ©΄ λ°©λ¬Έ μ§ν©μ λΉνΈλ§μ€ν¬λ‘ μ μ₯ν΄ λ©λͺ¨μ΄μ μ΄μ
νλ©΄ μνκ° μ΅λ
2^nκ°λ‘ μ€μ΄O(2^n Γ n)(μ½ 200λ§ λ²) μ λλ€.
κ³΅κ° λ³΅μ‘λ
visitedλ°°μ΄κ³Ό μ¬κ· κΉμ΄κ° κ°κ°O(n)μ λλ€.
μ μ΄ λ°©λ²μΌλ‘ νμ΄μΌ νλκ°
- 루νΈμμ μμ λ°©ν₯μΌλ‘λ§ λ΄λ €κ°λ λ¨μ DFS
- μ§κΈμ λλ λλ¬Έμ λͺ» κ°λ λ Έλκ°, λ€λ₯Έ κ°μ§μμ μμ λ¨Όμ λͺ¨μΌλ©΄ κ° μ μκ² λλ κ²½μ°λ₯Ό λμΉ©λλ€.
- λ°©λ¬Έν λ Έλ μ 체μ λΆμ ν보λ₯Ό λͺ¨λ μλν΄μΌ νλ―λ‘ λ°©λ¬Έ μ§ν©μ μνλ‘ μΌλ νμμ΄ νμν©λλ€.
- νμ μμ΄ μλ λ
Έλλ₯Ό λ¨Όμ κ°λ 그리λ
- μμ λ¨Όμ λͺ¨μΌλ€ 보면 λλ λ€μ μλ μλ€μ μμ μ»μ§ λͺ»ν μ μμ΅λλ€. λλ‘λ λλλ₯Ό λ°λ €κ°μΌ λ λ§μ μμ μ»μΌλ―λ‘ κ΅μμ μΈ μ νμΌλ‘λ μ΅μ ν΄λ₯Ό 보μ₯ν μ μμ΅λλ€.
- λ
Έλ μκ° μλ€λ μ μ½ νμ©
n β€ 17μ΄λΌ μμ νμκ³Ό λ°±νΈλνΉμ΄ κ°λ₯ν©λλ€. λ Έλκ° μμ² κ°λΌλ©΄ μ΄ λ°©λ²μ μΈ μ μκ³ λ€λ₯Έ μ κ·Όμ΄ νμν©λλ€.
π§© μ½λ ꡬν
class Solution {
int answer;
boolean[] visited;
int[] info;
int[][] edges;
public int solution(int[] info, int[][] edges) {
this.info = info;
this.edges = edges;
visited = new boolean[info.length];
visited[0] = true;
dfs(1, 0);
return answer;
}
private void dfs(int sheep, int wolf) {
if (wolf >= sheep) return;
answer = Math.max(answer, sheep);
for (int[] edge : edges) {
int parent = edge[0];
int child = edge[1];
if (visited[parent] && !visited[child]) {
visited[child] = true;
if (info[child] == 0) dfs(sheep + 1, wolf); // μ
else dfs(sheep, wolf + 1); // λλ
visited[child] = false;
}
}
}
}