λ¬Έμ μμ½
2μ§ νΈλ¦¬ λͺ¨μμΈ μ΄μμ κ° λ Έλμ μκ³Ό λλκ° ν λ§λ¦¬μ© λμ¬μλ€. 루νΈλ Έλμμ μΆλ°νμ¬ κ° λ Έλλ₯Ό λμλ€λλ©° μμ λͺ¨μ λ, μ΅λλ‘ λͺ¨μ μ μλ μμ κ°μλ?
[λ¬Έμ μ€λͺ ]
- 2μ§ νΈλ¦¬μ κ° λ Έλλ₯Ό λ°©λ¬Ένμ¬ μκ³Ό λλλ₯Ό λͺ¨μλ€.
- λͺ¨μμ§ λλμ κ°μκ° μμ κ°μλ³΄λ€ λ§κ±°λ κ°μ λ, λλλ μμ λͺ¨λ μ‘μ λ¨Ήλλ€.
- κ°κ° μ°κ²°λ λ Έλλ€μ λ€μν μμλ‘ λ°©λ¬Ένμ¬ μ΅λλ‘ λͺ¨μ μ μλ μμ κ°μλ₯Ό ꡬνλΌ.
[μ ν μ¬ν]
- info: λ Έλμ μ 보 (0: μ, 1: λλ) (2 ≤ infoμ κΈΈμ΄ ≤ 17) / info[0]μ νμ 0μ΄λ€.
- edges: μλ‘ μ°κ²°λ λ Έλ μ 보 (μΈλ‘ νμ κΈΈμ΄ = infoμ κΈΈμ΄ - 1, κ°λ‘ νμ κΈΈμ΄ = 2)
info | edges | result |
[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 |
λ¬Έμ μ κ·Ό
- κΉμ΄μ°μ νμ(dfs)μ μ¬μ©
- λ°©λ¬Έ μμμ λ°λΌ λλκ° μμ μ‘μ λ¨Ήμ μλ, μ‘μλ¨Ήμ§ μμ μλ μκΈ° λλ¬Έμ λͺ¨λ κ²½μ°μ μλ₯Ό νμ
- λ€λ§, ν λ
Έλ μμ μμ μμ μ ν¬ν¨ν΄ λλμ μμ μλ₯Ό κ³μ°νμ λ, λλ μκ° μλ³΄λ€ λ§μ λλ λμ΄μ νΈλ¦¬λ₯Ό νμνμ§ μλλ€.
- μμ΄ λλλ₯Ό μ‘μλ¨Ήμ΄ μμ μκ° μ΅λμμ 보μ₯νμ§ λͺ»νλ€.
μμΈν μ κ·Ό λ²μ μ½λμ μ£Όμμ νμΈνμΈμ π
import java.util.*;
public class Solution {
public static void main(String[] args) {
int result = solution(new int[]{0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0},
new int[][]{{0, 1}, {0, 2}, {1, 3}, {1, 4}, {2, 5}, {2, 6}, {3, 7}, {4, 8}, {6, 9}, {9, 10}});
System.out.println(result);
}
static ArrayList<Integer>[] tree;
static int max = Integer.MIN_VALUE;
public static int solution(int[] info, int[][] edges) {
tree = new ArrayList[info.length];
for (int[] edge : edges) {
int parent = edge[0];
int child = edge[1];
if (tree[parent] == null) {
tree[parent] = new ArrayList<>();
}
tree[parent].add(child);
}
// visit λΌλ boolean λ°°μ΄λ‘ λ°©λ¬Έμ μ²λ¦¬νμ§ μκ³ λ°©λ¬Έν λ
Έλλ₯Ό λ΄κ³ μλ 리μ€νΈλ₯Ό λ§λ λ€
List<Integer> visit_list = new ArrayList<>();
// 본격μ μΌλ‘ νμμ μμνκΈ° μ , νμ¬ λ
Έλ 0 (루νΈ)λ₯Ό λ°©λ¬Έν λ
Έλμ μΆκ°νλ€.
visit_list.add(0);
// νμμ μμνλ€.
dfs(0, 0, 0, visit_list, info);
return max;
}
private static void dfs(int current, int sheep, int wolf, List<Integer> visit_list, int[] info) {
// λ°©λ¬Έν λ
Έλκ° μμ΄λΌλ©΄ μμ μλ₯Ό 1 μ¦κ°μν¨λ€.
// λ°λμ κ²½μ° λλμ μλ₯Ό 1 μ¦κ°μν¨λ€.
if (info[current] == 0) sheep++;
else wolf++;
// λ§μ½ νμ¬ λ
Έλ μμ μμ λλμ μκ° μμ μλ³΄λ€ λ§λ€λ©΄ λμ΄μ νμνμ§ μλλ€.
if (wolf >= sheep) return;
// λ§μ½ νμ¬ λ
Έλ μμ μμ μμ μκ° μ΅λ μμ μλ³΄λ€ λ§μΌλ©΄ κ°μ κ°±μ νλ€.
max = Math.max(sheep, max);
// visit_listλ₯Ό 볡μ¬νμ§ μκ³ μΈ κ²½μ°, κ°μ κ°μ²΄λ₯Ό κ°λ¦¬μΌ visit_listμ κ°μ΄ νΌμλ μ μλ€.
List<Integer> copied_list = new ArrayList<>();
copied_list.addAll(visit_list);
// μμλ
Έλκ° μλ€λ©΄ λ°©λ¬Έ 리μ€νΈμ μΆκ°μν¨λ€.
if (tree[current] != null) {
for (int each : tree[current])
copied_list.add(each);
}
// νμ¬ νμνλ €λ λ
Έλλ λ°©λ¬Έ 리μ€νΈμμ μ κ±°νλ€.
copied_list.remove(Integer.valueOf(current));
// μ°¨λ‘λλ‘ λ
Έλλ€μ λ°©λ¬Ένλ€.
for (int next : copied_list) {
dfs(next, sheep, wolf, copied_list, info);
}
}
}
λλμ
μ²μ νμν λ, μ€λ³΅ λ°©λ¬Έμ μ€μ΄κΈ° μνμ¬ λ°©λ¬Ένλ λ ΈλκΉμ§ κ°μ§ μ μλ μ΅λ μμ κ°μλ₯Ό memoizationνλ λ°©λ²μ μκ°νλ€.
κ·Έλ¬λ λ°©λ¬Έ μμμ λ°λΌ λ°©λ¬Ένλ λ Έλ μμ μμ κ°μ§ μ μλ μμ μ΅λ κ°μκ° λ¬λΌμ§κΈ° λλ¬Έμ memoizationμ΄ νμνμ§ μμ κ²μ΄λΌ κ²°λ‘ λ΄λ Έλ€. μ΄λ λ¬Έμ λ λ§μ dfsλ‘ μΈν΄ μ¬κ·μ μ€λ³΅μ΄ λ§μμ§λ€λ κ²μΈλ°, μ€λ³΅μ μλ₯Ό μ€μ΄κΈ° μνμ¬ λλμ μμ μκ° κ°λ€λ©΄ λμ΄μ νμμ μ§ννμ§ μλ 쑰건μ μΆκ°νμλ€.
λ¬Έμ λ§ν¬: 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
'Algorithm > Coding Test' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Kakao 2022 Blind Test - Lv3. νκ΄΄λμ§ μμ 건물 (Java) (0) | 2022.06.30 |
---|---|
Kakao 2022 Blind Test - Lv2. μκΆλν (Java) (0) | 2022.06.11 |
Kakao 2022 Blind Test - Lv2. kμ§μμμ μμ κ°μ ꡬνκΈ° (Java) (0) | 2022.06.04 |
Kakao 2021 Blind Test - Lv3. κ΄κ³ μ½μ (Java) (0) | 2022.06.02 |
Kakao 2021 Blind Test - Lv3. ν©μΉ νμ μκΈ (Java) (0) | 2022.06.02 |
λκΈ