๋ฌธ์ ๋งํฌ: https://school.programmers.co.kr/learn/courses/30/lessons/92343
ํ์ด
ํ์ด๋ฐฉํฅ์ ์๋ชป ์ก์์ ๊ณ ์ํ๋ค.
์ฒ์์๋ ๋ฆฌํ ๋
ธ๋๋ถํฐ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉด์ ์ ๋
ธ๋์ ๊ฐ๊น์ด ์์๋๋ก ๋์ ์ ์๋ฅผ ๋ถ์ฌํ ๋ค, ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํด์ ํ์๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํ๋ฉด 1๋ฒ ๋ ธ๋์ 6๋ฒ ๋ ธ๋๊ฐ ๋์ผํ ์ ์๋ฅผ ๊ฐ๊ฒ ๋๋ค. 2๊ฐ์ ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์๋ 1๋ฒ ๋ ธ๋๊ฐ ๋ ์ ๋ฆฌํ ์ ํ์ง์ธ๋ฐ๋ ๋ง์ด๋ค. ๊ทธ๋์ ์ด ๋ฐฉ๋ฒ์ ํ๋ฆฐ ํ์ด๋ผ๋ ๊ฒฐ๋ก ์ ์ป๊ฒ ๋์๋ค.
๊ฒฐ๊ตญ ๊ตฌ๊ธ์ ๋์์ ๋ฐ์๊ณ ..ใ ใ ใ ใ ใ ์ด๋ฐ ํ์ด๋ฅผ ๋ฐ๊ฒฌํ๋ค.
ํต์ฌ์ ๋ฐฉ๋ฌธํ๋ ๋ ธ๋ ๋ชฉ๋ก์ ์ ์ฅํ๋ ๊ฒ์ด๋ค.
1-3-2 ์์๋ก ๋ฐฉ๋ฌธํ์ ๋์ 1-2-3 ์์๋ก ๋ฐฉ๋ฌธํ์ ๋๋ ๋์ผํ ์ํ์ด๋ค. (๋ ธ๋์ ๋ฐฉ๋ฌธ ์์๋ ๋ฌธ์ ์ ๋ต๊ณผ ๊ด๋ จ์ด ์๋ค.) ๋ฐ๋ผ์ 1-3-2๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด, 1-2-3์ ๋ฐฉ๋ฌธ ํจ์๋ฅผ ๋๋ฆฌ์ง ์์๋ ๋๋ค.
๋ฐฉ๋ฌธํ๋ ๋
ธ๋ ๋ชฉ๋ก์ ์ ์ฅํ๊ธฐ ์ํด, ํ์ฌ ๋ฐฉ๋ฌธ ๋ชฉ๋ก์ ๋นํธ๋ง์คํน์ ํตํด visited๋ผ๋ ์ ์๋ก ๊ด๋ฆฌํ๋ค.
์๋ฅผ ๋ค์ด 0๋ฒ ๋
ธ๋์ 3๋ฒ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค๋ฉด, visited์ ๊ฐ์ 2์ง์๋ก 1001, ์ฆ 9๊ฐ ๋๋ค.
๋ฐฉ๋ฌธ ํจ์
void dfs(int now, int wolf, int sheep, int visited, int[] info) {
if(checked[visited]) return;
checked[visited] = true;
if(info[now]==0) sheep++;
else wolf++;
if(sheep>=wolf) {
answer = Math.max(answer, sheep);
}
if(wolf>=sheep) return;
for (int i=0; i<N; i++) {
if((visited&(1<<i)) == 0) continue;
for (int next : graph[i]) {
dfs(next, wolf, sheep, visited|(1<<next), info);
}
}
}
(1) ์ด๋ฏธ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ ๋ ธ๋ ์กฐํฉ์ธ ๊ฒฝ์ฐ: ๋ฐ๋ก ํจ์๋ฅผ ์ข ๋ฃํ๋ค.
(2) ํ์ฌ ๋ ธ๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ฐ์์ ๋๋ ๊ฐ์๋ฅผ ์ ๋ฐ์ดํธ
(3) ์์ ๊ฐ์ >= ๋๋ ๊ฐ์ ์ธ ๊ฒฝ์ฐ, ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์์ด๋ฏ๋ก ์์ ์ต๋๊ฐ(answer)์ ๊ฐฑ์ ํ๋ค.
(4) ์์ ๊ฐ์ <= ๋๋ ๊ฐ์์ธ ๊ฒฝ์ฐ, ์์ด ๋๋์๊ฒ ์ก์๋จนํ๋ฏ๋ก ํจ์๋ฅผ ์ข ๋ฃํ๋ค.
(5) 0๋ฒ ๋ ธ๋ ~ N๋ฒ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ ๋ ธ๋์ ์์๋ค์ ๋ค์ ๋ฐฉ๋ฌธ ๋ ธ๋๋ก ์ผ์ dfs๋ฅผ ๋๋ฆฐ๋ค.
๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ ๋ ธ๋ ์ฐพ๊ธฐ
๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ ๋
ธ๋๋ฅผ ์ฐพ๊ธฐ ์ํด ๋นํธ ์ฐ์ฐ์ &๋ฅผ ์ฌ์ฉํ๋ค.
0๋ฒ ๋
ธ๋์ 3๋ฒ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ํ๋ผ๊ณ ๊ฐ์ ํ๋ฉด, visited๋ 2์ง์๋ก 1001์ด ๋๋ค.
(1) 2๋ฒ ๋ ธ๋๋ฅผ ํ์ธํ๋ ๊ฒฝ์ฐ
2๋ฒ ๋ ธ๋๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋์ง ์์ ๋ ธ๋์ด๋ฏ๋ก, AND ์ฐ์ฐ์ ํ๋ฉด 0์ด ๋์จ๋ค.
(2) 3๋ฒ ๋ ธ๋๋ฅผ ํ์ธํ๋ ๊ฒฝ์ฐ
3๋ฒ ๋ ธ๋๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ ๋ ธ๋์ด๋ฏ๋ก, AND ์ฐ์ฐ์ ํ๋ฉด ์์๊ฐ ๋์จ๋ค.
์ด๋ ๊ฒ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ ๋ ธ๋์ ์์๋ค์ ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ ๋ ธ๋์ด๋ฏ๋ก, ์์๋ค์ ๋ค์ ๋ฐฉ๋ฌธ ํ๊ฒ์ผ๋ก ์ผ์ dfs๋ฅผ ๋๋ ค์ฃผ๋ฉด ๋๋ค.
์ ์ฒด ์ฝ๋
import java.util.*;
class Solution {
List<Integer>[] graph;
int N, M, ROOT = 0;
boolean[] checked;
int answer=0;
public int solution(int[] info, int[][] edges) {
N = info.length;
M = edges.length;
checked = new boolean[1<<N];
graph = new ArrayList[N];
for (int i=0; i<N; i++) {
graph[i] = new ArrayList<>();
}
for (int i=0; i<M; i++) {
int a = edges[i][0];
int b= edges[i][1];
graph[a].add(b);
}
dfs(ROOT,0,0,1,info);
return answer;
}
void dfs(int now, int wolf, int sheep, int visited, int[] info) {
if(checked[visited]) return;
checked[visited] = true;
if(info[now]==0) sheep++;
else wolf++;
if(sheep>=wolf) {
answer = Math.max(answer, sheep);
}
if(wolf>=sheep) return;
for (int i=0; i<N; i++) {
if((visited&(1<<i)) == 0) continue;
for (int next : graph[i]) {
dfs(next, wolf, sheep, visited|(1<<next), info);
}
}
}
}
'๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฑ์ฐ์ฝ์ค ์ ํ๊ธฐ (1) | 2023.11.08 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ํ ๋ณํฉ (0) | 2023.09.10 |
[๋ฐฑ์ค 5052] ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2023.09.04 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์์ด์ปจ (0) | 2023.09.04 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์ฝ๋ฉ ํ ์คํธ ๊ณต๋ถ (0) | 2023.08.31 |