1. ๋ฌธ์ ์ค๋ช ๐
(1) ๋งํฌ๐
(2) ์ฃผ๋ชฉ ํฌ์ธํธ ๐ต
- 1๏ธโฃ
๋๋
>=์
์ด๋ฉด ๋ชจ์๋ ์์ ๊ฐ์๊ฐ 0์ด ๋๋ค! - 2๏ธโฃ ํ์ฌ ํน์ ํ ์๋ธ ํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธ ์ค์ด๋ผ ๊ฐ์ ํ ๋, ํด๋น ํธ๋ฆฌ์์ ์ต๋ ์ด์ต์ ์ด๋ฏธ ๋๋ค๊ณ ํ์ ํ๋ค๋ฉด, ์กฐ์ ๋ ธ๋๋ฅผ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ ๋ค๋ฅธ ์๋ธ ํธ๋ฆฌ๋ฅผ ํ๊ณ ๋๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
2. ์๊ฐ์ ํ๋ฆ: ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐๏ธ
(1) IDEA ๋์ถ๐ก
KEY WORD
: BACK-TRACKING
, DFS
ํด์ค์์ ์ค๋ช
ํ 2๏ธโฃ๋ฒ์งธ ํฌ์ธํธ ๋๋ฌธ์, ์ด๋ฒ ๋ฌธ์ ๋ BACK-TRACKING
์ ๊ฐ๊น๊ฒ ๋ณํ๋ DFS
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๊น์ด ์ฐ์ ํ์์ ํ๋ ์ฑ์ง์ ๊ฐ์ผ๋, ํ ๋
ธ๋์ ์ผ์ด ๋
ธ๋
ํน์ ์กฐ์นด ๋
ธ๋
๋ ๋ค์ ํ์ ํ๋ณด์ง์ ๋ฃ์ด์ผ ํ๋ค.
์ ์ถ๋ ฅ ์์ #2๋ฅผ ์๋ก ๋ค์ด๋ณด๊ฒ ๋ค.
ํ์ฌ 5๋ฒ ๋
ธ๋
๋ฅผ ๋ฐฉ๋ฌธ ์ค์ด๋ผ ํด๋ณด์. ์ด์ ๋ค์์ ๊ฐ ์ ์๋ ํ๋ณด์ง๋ฅผ ์๊ฐํด๋ณด๋ฉด,
์ผ์ด ๋
ธ๋
์ธ 1๋ฒ ๋
ธ๋์ ํ์ ๋
ธ๋
์ธ 6๋ฒ ๋
ธ๋์ด๋ค. ๋ค์ DFS ์ฌ๊ท๋ฅผ 1๋ฒ ๋
ธ๋๋ก ํ๋ ๊ฒ์, '์์ ๊ฐ์๋ง ๋๋ฆด ์๋ง ์๋ค๋ฉด, ์กฐ์ ๋
ธ๋๋ฅผ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ ๋ค๋ฅธ ์๋ธ ํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ ์ ์๋ค.'๋ ๋ฌธ์ ์ ์กฐ๊ฑด์ ๊ตฌํํ๋ ํ์์ด๋ค.
๋ฐ๋ผ์ DFS ์ฌ๊ท๋ฅผ ํ ๋, ๋ถ๋ชจ ๋ ธ๋๊ฐ ๊ฐ์ก๋ ํ๋ณด์ง๋ฅผ ์์๋ ธ๋์๊ฒ ๊ทธ๋๋ก ๋๋ฌผ๋ฆผ ํด์ค์ผ ํ๋ค!
์ค์ํ๊ธฐ ์ข์ ํฌ์ธํธ๐จ
Call by Value
, Call by address
ArrayList
๋ ํ๋์ ๊ฐ์ฒด์ด๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ฅผ ๋งค์๋์ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ผ๋ฉด, ์ฃผ์๊ฐ์ด ๋ณต์ฌ๋์ด ๋ค์ด๊ฐ์, ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ ํจ์๊ฐ ๋๋ ๋ค์๋ ์ ์ง๋๋ค. ๋ฐ๋ผ์ ๋ถ๋ชจ ๋
ธ๋์ ํ๋ณด์ง๋ฅผ ๊ทธ๋๋ก ๋ฐ์ ๊น์ด ํ์์ ์ฌ์ฉํ๋ค๋ฉด, ๊น์ด ํ์์ ํ ๋ฒ ํ ๋๋ง๋ค, ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ ํ๋ณด์ง์ ์ํฅ์ ์ค ๊ฒ์ด๋ค. ์ด๋ ํํ ์ค์ฐจ๋ฅผ ๋ฐ์์ํจ๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๊น์ด์์ ํ๋ณด์ง List๋ฅผ ์๋ก ๋ง๋ ๋ค! ์ฌ๊ธฐ์ ๊ฐ์ ๋ฃ์ด์ ์ฌ์ฉํด์, ํ๋ณด์ง ๊ณ์ฐ์ ํด๋น ์ฌ๊ท์์๋ง ์ ํจํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
(2) SUDO CODE ๐
- 0๏ธโฃ ์ธ์ ๋ฆฌ์คํธ ํํ๋ก ํธ๋ฆฌ ๊ตฌํ
- 1๏ธโฃ ์ฌ๊ท ํจ์ ๋ง๋ค๊ธฐ
- a. ํ์ฌ ๋ฐฉ๋ฌธํ ๋
ธ๋์ ์์ด ์๋์ง, ๋๋๊ฐ ์๋์ง ํ์ธ ๋ฐ ๊ทธ ๊ฐ์ ๋์
์
<=๋๋
์ด๋ฉด ํด๋น ์ฌ๊ท ๋ฐ๋ก ํ์ถ์
>๋๋
์ด๋ฉด ๋์ ๋ ์์ ๊ฐ์๋ฅผ ํ์ฌ๊น์ง์ ์์ ์ต๋๊ฐ(ans)๊ณผ ๋น๊ต ํ ans ๊ฐฑ์
- b. ํ ๋ ธ๋์ ์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ํ๋ณด์ง List์ ๋ฃ๋๋ค.
- c. ๋ฐฉ๋ฌธ ํ๋ณด์ง๋ ๋ถ๋ชจ์๊ฒ์ ๋ฐ์ ๊ฒ์ด๋ฏ๋ก, ํ ๋ ธ๋๋ ์์ง ๊ทธ ์ค์ ํฌํจ๋์ด ์๋ค. ํ ๋ ธ๋์ ์, ๋๋ ๊ณ์ฐ์ ๋๋ฌ์์ผ๋ก ๋ฆฌ์คํธ์์ ์ ๊ฑฐํด์ค๋ค.
- d. ํ๋ณด์ง๋ฅผ ํ๋์ฉ ๋ฐฉ๋ฌธํ๋ค. (์ด๋, ๋ฐฉ๋ฌธ ํ๋ณด์ง๋ฅผ ๊ฐ์ด ๋ฃ์ด์ค์ผ ํ๋๋ฐ, ๊ทธ๋๋ก ๋ฃ์ง๋ง๊ณ ArrayList๋ฅผ ์๋ก ๋ง๋ค์ด์ ๊ฑฐ๊ธฐ ์๋์ ๊ฐ์ ์ฑ์ด ํ ๋ฃ๋๋ค! (
call by address
์ฃผ์))
- a. ํ์ฌ ๋ฐฉ๋ฌธํ ๋
ธ๋์ ์์ด ์๋์ง, ๋๋๊ฐ ์๋์ง ํ์ธ ๋ฐ ๊ทธ ๊ฐ์ ๋์
- 2๏ธโฃ์ฌ๊ท ํจ์๋ก ๊ตฌํ ans๋ฅผ ๋ฐํํ๋ค.
(3) ์๊ฐ๋ณต์ก๋ ๋ถ์ ๐
๋
ธ๋ ๊ฐ์๊ฐ ์ต๋ 17
์ด๋ค. ์๋ฌด๋ฆฌ ๋ฐฑํธ๋ํน์ ํ๋ค์ง๋ง, 1์ต๋ฒ์ ์ ๋ ๋๊ธธ ์ ์๋ค. ๋ฐ๋ผ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ตณ์ด ์ ๋ฐ์ ธ๋ ๋๋ ๋ฌธ์ ์ด๋ค.
3. ๊ตฌํ ์ฝ๋ ๐
import java.util.*;
class Solution {
static int ans = 0;
static ArrayList<Integer> [] nodes = new ArrayList [17];
static int [] INFO;
public int solution(int[] info, int[][] edges) {
INFO = info;
for(int i = 0; i < 17; i++){
nodes[i] = new ArrayList<>();
}
for(int i = 0; i < edges.length; i++){
int parent = edges[i][0];
int child = edges[i][1];
nodes[parent].add(child);
}
ArrayList<Integer> non_visited = new ArrayList<Integer>();
non_visited.add(0);
recur(0, non_visited , 0, 0);
return ans;
}
public void recur(int now, ArrayList<Integer> non_visited, int lamps, int wolfs){
if(INFO[now] == 0) lamps++;
else wolfs++;
if(lamps <= wolfs) return;
// (0) ์ ์ต๋๊ฐ ์ ์ฅ
ans = Math.max(lamps, ans);
// (1) ์์ ๋
ธ๋ ๋ฏธ๋ฐฉ๋ฌธ ์ ์ ์ ๋ฃ๊ธฐ
non_visited.addAll(nodes[now]);
// (2) ๋ฏธ๋ฐฉ๋ฌธ ์ ์ ์์ ์๊ธฐ ์์ ์ ๋นผ๊ธฐ
non_visited.remove(Integer.valueOf(now));
// (3) non_visited์ ํด๋นํ๋ ์ ์ ํ๋์ฉ ๋ฐฉ๋ฌธ
for(int i = 0; i < non_visited.size(); i++){
int next = non_visited.get(i);
ArrayList<Integer> next_nodes = new ArrayList<>(non_visited);
recur(next,next_nodes, lamps, wolfs);
}
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
(1) list.remove(i) vs list.remove(Integer.valueOf(i))
ArrayList์ remove() ํจ์๋ 2๊ฐ์ง ํํ๋ก ์ค๋ฒ๋ก๋ฉ ๋์ด ์๋ค.
- 1๏ธโฃ
list.remove(i)
: ์์ ์๋ฃํ int๋ฅผ ๋ฃ์ผ๋ฉด, ์ด๋ฅผindex
๋ก ์ธ์ํด์ ํด๋น index์ ๊ฐ์ ์ง์ด๋ค. - 2๏ธโฃ
list.remove(Object o)
: ๊ฐ์ฒด๋ฅผ ๋ฃ์ผ๋ฉด, ๊ทธ์ ๊ฐ์value
๋ฅผ ์ญ์ ํ๋ค.
๋ฌธ์ ์์์ ์ ์ฉ์ โจ
ํด๋น ๋ฌธ์ ์ ๋ฐฉ๋ฌธํ ๋
ธ๋ ํ๋ณด์ง
๋ ArrayList<Integer>
ํํ๋ก ๋์ด ์๋ค. ์ฌ๊ธฐ์ i๋ผ๋ ๋
ธ๋๋ฅผ ์ง์ฐ๊ณ ์ถ๋ค๊ณ , list.remove(i)
๋ฅผ ํ๋ฉด, ์ํ๋ ๊ฐ์ด ์๋ index๊ฐ i์ธ ๊ฐ์ด ์๋ฑํ๊ฒ ์ง์์ง ๊ฒ์ด๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, int ์๋ฃํ์ Wrapper Class์ธ Integer์ ๊ฐ์ฒด๋ก ๋ณํํ๋ ์์
์ ๊ฐ์ก๋ค. ์ด์ ํด๋น ๋
ธ๋ ๋ฒํธ๋ ๊ฐ์ฒด๊ฐ ๋์์์ผ๋ก, ์์ ์ค๋ช
๋ 2๏ธโฃ์ remove๊ฐ ์์ฐ์ค๋ฝ๊ฒ ํธ์ถ๋๋ค.
list.remove(Integer.valueOf(i))
์ด๋ชจ์ง ๋ชจ์: ๐ค, โ โจ 0๏ธโฃ1๏ธโฃ2๏ธโฃ3๏ธโฃ4๏ธโฃ5๏ธโฃ6๏ธโฃ7๏ธโฃ8๏ธโฃ9๏ธโฃ๐