2023. 11. 22. 10:18ใ์ธํ๋ฐ/์๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์ ๋ฌธ : ์ฝ๋ฉํ ์คํธ ๋๋น
https://hyejin.tistory.com/1257
-> ์ด์ ๋ฌธ์ ํ์ด
6. ๋ถ๋ถ์งํฉ ๊ตฌํ๊ธฐ
์ค๋ช
์์ฐ์ N์ด ์ฃผ์ด์ง๋ฉด 1๋ถํฐ N๊น์ง์ ์์๋ฅผ ๊ฐ๋ ์งํฉ์ ๋ถ๋ถ์งํฉ์ ๋ชจ๋ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ ์ ์์ฑํ์ธ์.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ์์ฐ์ N(1<=N<=10)์ด ์ฃผ์ด์ง๋๋ค.
์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค๋ถํฐ ๊ฐ ์ค์ ํ๋์ฉ ๋ถ๋ถ์งํฉ์ ์๋์ ์ถ๋ ฅ์์ ์ ๊ฐ์ ์์๋ก ์ถ๋ ฅํ๋ค.
๋จ ๊ณต์งํฉ์ ์ถ๋ ฅํ์ง ์์ต๋๋ค.
์์ ์ ๋ ฅ 1
3
์์ ์ถ๋ ฅ 1
1 2 3
1 2
1 3
1
2 3
2
3
๋ฌธ์ ํ์ด 1
public class FindingASubset
{
static int n; // ์งํฉ ์์์ ๊ฐ์
static int[] ch; // ๋ถ๋ถ์งํฉ์ผ๋ก ์ฌ์ฉํ๋ค, ํ์ง ์๋๋ค ์ฒดํฌํ๊ธฐ ์ํด์
public void DFS(int L)
{
if (L == n + 1) {
String tmp = "";
for (int i = 1; i <= n; i++)
{
if (ch[i] == 1) {
tmp += i + " ";
}
}
if (tmp.length() > 0) {
System.out.println(tmp);
}
}else {
ch[L] = 1;
DFS(L + 1); // ํธ๋ฆฌ์ ์ผ์ชฝ (์ฌ์ฉํ๋ค)
ch[L] = 0;
DFS(L + 1); // ํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ (์ฌ์ฉํ์ง ์๋๋ค.)
}
}
public static void main(String[] args)
{
FindingASubset findingASubset = new FindingASubset();
Scanner scanner = new Scanner(System.in);
int L = scanner.nextInt();
n = L;
ch = new int[n + 1];
findingASubset.DFS(1);
}
}
๐พ : DFS ๊ด๋ จ ๋ฌธ์ ๋์ค๋ฉด ์ด๋ ต๋ค.. ๊ทธ๋์ ๊ฒฐ๊ตญ ์ด๋ฒ์๋ ํ์ง ๋ชปํ๊ณ ... ๊ฐ์ฌ๋์ ๊ฐ์๋ฅผ ๋ค์๋ค.
์ฌ์ค ์ด๋ฒ์ DFS ์ ๋ํด์ ์ฒ์ ๊ณต๋ถํ๊ธฐ๋ ํ๋.. ๊ฐ์ ํ์คํ ๋ฃ๊ณ , ๋์ค์ ๊ด๋ จ ๋ฌธ์ ๋์ฌ ๋ ์์ฉํ ์ ์๋๋ก ์ตํ๋ฌ์ผ ๊ฒ ๋ค.
๋ฌธ์ ๋ ์ฐ์ DFS(1) ์์ DFS(2), DFS(2) ๋ฅผ ํธ์ถํด์ฃผ๋๋ฐ ์ด๋ ์ผ์ชฝ DFS(2)๋ ํด๋น ๊ฐ์ ๋ถ๋ถ์งํฉ์ ํฌํจํ๋ค๋ ๋ป(ch[2] = 1) ์ด๊ณ , ์ค๋ฅธ์ชฝ DFS(2)๋ ํด๋น ๊ฐ์ ๋ถ๋ถ ์งํฉ์์ ํฌํจํ์ง ์๋๋ค๋ ๋ป์ด๋ค. (ch[2] = 0)
์ด๋ฐ์์ผ๋ก ๊ฐ์ง ์น๊ธฐ๋ฅผ ํด์ ๋ถ๋ถ ์งํฉ์ ๊ตฌํด์ค ๊ฒ์ด๋ค.
1๏ธโฃ
static int n; // ์งํฉ ์์์ ๊ฐ์
static int[] ch; // ๋ถ๋ถ์งํฉ์ผ๋ก ์ฌ์ฉํ๋ค, ํ์ง ์๋๋ค ์ฒดํฌํ๊ธฐ ์ํด์
์ด๋ฒ์๋ ์ ์ญ ๋ณ์ n๊ณผ ch intํ ๋ฐฐ์ด์ ์ ์ธํ๋ค.
n์ ์งํฉ ์์์ ๊ฐ์๋ฅผ ๋ํ๋ด๊ณ , ch๋ n ๋งํผ์ ๋ฐฐ์ด์ ์ ์ธํด์ ํด๋น ๊ฐ์ ํฌํจํ ์ง (1) ์ํ ์ง(0) ๋ฅผ ์ง์ ํด์ค ๊ฒ์ด๋ค.
2๏ธโฃ
public static void main(String[] args)
{
FindingASubset findingASubset = new FindingASubset();
Scanner scanner = new Scanner(System.in);
int L = scanner.nextInt();
n = L;
ch = new int[n + 1];
findingASubset.DFS(1);
}
๋ค์์๋ ์ ๋ ฅ ๊ฐ L ์ ๋ฐ๊ณ , ์์์ ์ ์ธํ ์ ์ญ๋ณ์ n์ L ๊ฐ์ ๋์ ํด์ฃผ๊ณ , ch ๋ฐฐ์ด์ ํฌ๊ธฐ๋ n + 1๋ก ์ ์ธํด์ค๋ค.
n+1๋ก ์ ์ธํ๋ ์ด์ ๋ ch[0]์ ์ ์ธํ๊ณ ํ ์์ ์ด๋ผ์...
๊ทธ๋ฆฌ๊ณ DFS ํจ์๋ฅผ ํธ์ถํ๋๋ฐ ๋งจ ์ฒ์ 1๋ถํฐ ๋์ ํด์ ์์ํ๋ค.
3๏ธโฃ
public void DFS(int L)
{
if (L == n + 1) {
String tmp = "";
for (int i = 1; i <= n; i++)
{
if (ch[i] == 1) {
tmp += i + " ";
}
}
if (tmp.length() > 0) {
System.out.println(tmp);
}
}else {
ch[L] = 1;
DFS(L + 1); // ํธ๋ฆฌ์ ์ผ์ชฝ (์ฌ์ฉํ๋ค)
ch[L] = 0;
DFS(L + 1); // ํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ (์ฌ์ฉํ์ง ์๋๋ค.)
}
}
DFS ํจ์์์๋ L ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ฐ ์ฐ์ 1๋ถํฐ ์์ํ๋ค.
๊ทธ๋ผ DFS(1) ์ธ๋ฐ ์ด๋ if-else๋ก ๋ง์ฝ L์ด n+1 ์ด๋๋ฉด ๊ทธ๋ ๋ฐฐ์ด์ ๊ฐ ์ค 1์ธ ์ธ๋ฑ์ค ๊ฐ์ ์ถ๋ ฅํด์ค ๊ฒ์ด๋ค.
L์ด n+1์ด ์๋๋ผ๋ฉด ์ด์ ch[L]์ ์ฐ์ 1 ๊ฐ์ ๋์ ํด์ฃผ๊ณ , ๊ทธ ๋ค์ DFS(2) ๋ฅผ ํธ์ถํ๋ค.
... ์ด๋ฐ์์ผ๋ก ๋์๊ฐ๋ค๊ฐ L์ด n+1 ์ฆ, ์ฌ๊ธฐ์ 4๊ฐ ๋๋ฉด ch ๋ฐฐ์ด์์ 1์ธ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ถ๋ ฅํด์ฃผ๊ณ , -> 1 2 3 ์ถ๋ ฅ
๋ค์ DFS(3) ์ผ๋ก ๋์์จ๋ค.
๋ค์ DFS(3) ์ผ๋ก ๋์์จ๋ค. DFS(3) ์์ ch[3] = 0์ผ๋ก ๊ฐ์ ์ค์ ํด์ฃผ๊ณ , ๊ทธ ๋ค์ DFS(4)๋ฅผ ํธ์ถํ๋ค.
๊ทธ๋ฌ๋ฉด DFS(4)๋ n+1 ์ด๋ฏ๋ก, ch ๋ฐฐ์ด์ ๊ฐ์ด 1์ธ ์ธ๋ฑ์ค๋ฅผ ์ถ๋ ฅํ๋ค. -> 1 2 ์ถ๋ ฅ
๋ค์ DFS(3) ์ด ๋๋ฌ์ผ๋ DFS(2)๋ก ๋์์จ๋ค.
DFS(2)๋ก ๋์์์ ch[2] = 0 ์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๊ณ , DFS(3) ์ ํธ์ถํ๋ค.
๊ทธ๋ฌ๋ฉด ๋ ๋ฐ๋ณตํด์ DFS(3) ์ ch[3] = 1 ํ๊ณ , DFS(4) ํธ์ถํด์ ch๊ฐ 1์ธ ์ธ๋ฑ์ค ๊ฐ ํธ์ถํ๋ค. -> 1 3 ํธ์ถ
๊ทธ๋ฆฌ๊ณ ๋ค์ DFS(3)์ผ๋ก ๋์๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ DFS(3)์ผ๋ก ๋์์ค๋ฉด ์ด์ ch[3] = 0 ์ ๋์ ํ๊ณ , DFS(4)๋ฅผ ํธ์ถํด์ ๋ค์ ch์ ๊ฐ์ด 1์ธ ์ธ๋ฑ์ค๋ฅผ ํธ์ถํด์ค๋ค. -> 1 ์ถ๋ ฅ
... ์ด๋ฐ์์ผ๋ก ๋ฐ๋ณตํ๋ฉด ๋ถ๋ถ ์งํฉ์ ์ถ๋ ฅํ ์ ์๋ค.
+ ์ถ๊ฐ๋ก ๋ ํด๋ณด์๋ฉด...
DFS(2) ๋ ๊ทธ๋ฌ๋ฉด ๋๋ฌ์ผ๋ฏ๋ก ๋ค์ DFS(1)๋ก ๋์์์ ch[1] = 0 ์ ์ค์ ํ ๋ค์, DFS(2) ๋ฅผ ํธ์ถํ๋ค.
๊ทธ๋ผ DFS(2)๋ ๋ค์ ch[2] =1 ํ๊ณ , DFS(3) ํธ์ถํ๊ณ , ch[3] = 1 ์ค์ ํ ๋ค์, DFS(4) ๋ฅผ ๋ง๋๋ฉด ch์ ๊ฐ์ด 1์ธ ์ธ๋ฑ์ค ๊ฐ์ ํธ์ถํ๋ค . -> 2 3 ์ถ๋ ฅ
๊ทธ๋ฌ๊ณ ๋ค์ DFS(3) ์ผ๋ก ๋์์ค๋ฉด ch[3] = 0 ์ด๊ณ DFS(4) ๋ฅผ ํธ์ถํด ch ๋ฐฐ์ด์ ์์ ๊ฐ์ด 1์ธ ์ธ๋ฑ์ค ๊ฐ์ ํธ์ถํ๋ค.
-> 2 ์ถ๋ ฅ
๊ทธ๋ฌ๋ฉด DFS(3)๋ ๋๋ฌ๊ณ , ๋ค์ DFS(2)๋ก ๋์์์ ch[2] = 0 ์ผ๋ก ์ค์ ํ๊ณ ๋ค์ DFS(3)์ ํธ์ถํ๋ค.
๊ทธ๋ฌ๋ฉด DFS(3) ์ ch[3] = 1 ํ๊ณ , DFS(4) ํธ์ถํ๋ฏ๋ก ch ๋ฐฐ์ด์ ์์ ๊ฐ์ค์ 1์ธ ์ธ๋ฑ์ค ๊ฐ์ ํธ์ถํ๋ฉด -> 3 ์ถ๋ ฅ
๊ทธ ๋ค์ DFS(3)์ผ๋ก ๋์์ค๊ณ , ch[3] = 0 ์ ์ค์ ํ ๋ค์, DFS(4) ํธ์ถํ๋ฉด ์ด์ ๋ชจ๋ ๊ฐ์ด 000์ด๋ฏ๋ก ์ถ๋ ฅํ๋๊ฒ ์์ด ๋๋๊ฒ ๋๋ค !