์๋ ํ์ธ์ Foma ๐ป ์ ๋๋ค!
์ค๋์ ํ๋ก๊ทธ๋๋จธ์ค N-Queen ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ํด๋น ๋ฌธ์ ๊ฐ ๋ฐฑํธ๋ํน ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๋๋ฐ์.
๊ทธ๋์ ๋ฐฑํธ๋ํน์ด ๋ฌด์์ด๊ณ ์ด๋ป๊ฒ ๊ตฌํํด์ ์ฌ์ฉํด์ผ ํ๋์ง์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
๋ฐฑํธ๋ํน์ด๋?
๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ๋ถ ๊ณ ๋ คํ๋ ์๊ณ ๋ฆฌ์ฆ ์ํ๊ณต๊ฐ์ ํธ๋ฆฌ๋ก ๋ํ๋ผ ์ ์์ ๋ ์ ํฉํ ๋ฐฉ์์ด๋ค. ์ผ์ข ์ ํธ๋ฆฌ ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ด๋ ๋๋ค. ๋ฐฉ์์ ๋ฐ๋ผ์ ๊น์ด์ฐ์ ํ์(Depth First Search, DFS)๊ณผ ๋๋น์ฐ์ ํ์(Breadth First Search, BFS), ์ต์ ์ฐ์ ํ์(Best First Search/HeuristicSearch)์ด ์๋ค. ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ ๋ฌธ์ ๋ผ๋ฉด, DFS๊ฐ ๋ซ๋ค. BFS๋ก๋ ๊ตฌํ์ด ๋ฌผ๋ก ๊ฐ๋ฅํ์ง๋ง, BFS๋ก ๊ตฌํํ๋ค๊ฐ ํ์ ํฌ๊ธฐ๊ฐ . ์ฌ์ง์ด ์๋๋ ๋๊ฐ๋ค. ๋ฐ๋ผ์ ๊ฒฝ์ฐ์ ์ ๊ตฌํ๊ธฐ๋ ์ผ๋ฐ์ ์ผ๋ก DFS๊ฐ ํธ๋ฆฌํ๋ค. ๋๋ค์์ ๋ฌธ์ ๋ค์DFS๋ฅผ ์จ๋ ์ผ๋จ ๋ต์ ๋์จ๋ค. - ๋๋ฌด ์ํค -
์ฆ, DFS๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ฝ ์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด ๊ทธ ์ฆ์ ์ค๋จํ๊ณ ์ด์ ์ผ๋ก ๋์๊ฐ์ฌ ๋ค์ ํ์ธํ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ฉด์ ์ํ๋ ์กฐ๊ฑด์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ ์ ๋๋ค.
์ด๋ ๊ฒ ๋งํ๋ฉด ์ดํดํ๊ธฐ ํ๋์ค๊ฑฐ์์.
ํ์ง ๋ง๋ค๊ธฐ
A,B,C ์ธ ์ฌ๋์ด ๊ฐ์ง๊ณ ์๋ ์ซ์๋ฅผ ์ฐจ๋ก๋๋ก ํ๋์ฉ ์ค ์ธ์๋๋ค.
๋จ, ์กฐ๊ฑด์ ์ง์๋ ํ์๊ฐ ์ฐ์์ผ๋ก 2๋ฒ ๋์ค๋ฉด ์๋ฉ๋๋ค.
์ด ๋ ๋ง๋ค ์ ์๋ ์ซ์๋ฅผ ๋ชจ๋ ๊ตฌํ์์ค.
(์์๋ A-B-C ์ ๋๋ค.)
A - 1
B - 4
C- 7
ํ์๋ ์ง์๊ฐ ์ฐ์๋์ง ์์ผ๋ฏ๋ก ๊ฐ๋ฅํฉ๋๋ค.
A - 1
B - 4
C - 8
์ง์๊ฐ ์ฐ์๋๋ฏ๋ก ๊ฐ๋ฅํ์ง ์์ต๋๋ค.
A - 1
B - 4
C - 9
ํ์๋ ์ง์๊ฐ ์ฐ์๋์ง ์์ผ๋ฏ๋ก ๊ฐ๋ฅํฉ๋๋ค.
A - 1
B - 5
ํ์๊ฐ ์ฐ์๋๋ฏ๋ก ๊ฐ๋ฅํ์ง ์์ต๋๋ค.
๊ณ ๋ก B์ ๋ค์ ์ซ์๋ก ๋ฐ๋ก ๋์ด๊ฐ๋๋ค.
์ด๋ฐ์์ผ๋ก ์กฐ๊ฑด๋ค์ ํ๋์ฉ ๋์ ํด๊ฐ๋ฉด์ ๋ง์ฝ ์กฐ๊ฑด์ ๋ง์ง ์๋๋ค๋ฉด ๊ทธ ์ฆ์ ์ค๋จํ๊ณ ๋ค์ ์ซ์๋ก ๋์ด๊ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณค ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํด ๊ฐ๋ฅํ ๋ชจ๋ ์ซ์ ์กฐํฉ์ ์ฐพ์๋ ๋๋ค.
์ฝ๋ ๊ตฌํ
A,B,C์ ์ซ์๋ค์ ์ฐจ๋ก๋ก ๋ด์ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ฃ์ด์ฃผ๊ฒ ์ต๋๋ค.
[[1,2,3],[4,5,6],[7,8,9]]
๊ฐ๋ฅํ ์ซ์ ์กฐํฉ๋ค์ ๋ด์ answer 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋๋ค.
var answer:[[Int]] = []
A,B,C์ ์ซ์๋ค์ ๋ด๋ numbers,
ํ์ฌ ๊น์ด๊ฐ ์ด๋ ์ ๋์ธ์ง ๋ํ๋ผ depth,
๊ฐ๋ฅํ ์ซ์ ์กฐํฉ์ ๋ฃ์ answer,
ํ์ฌ depth๊น์ง ์ซ์๋ค์ ๊ธฐ์ตํ history๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๊ตฌํํด์ค๋๋ค.
func dfs(numbers:[[Int]],depth:Int,answer:inout [[Int]],history:[Int]) {
...
๋ง์ฝ depth๊ฐ numbers์ ๋๊น์ง ์๋ค๋ฉด ๋ชจ๋ ์ซ์๋ค์ด ์กฐ๊ฑด์ ๋ง์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก answer์ history๋ฅผ ๋ฃ์ด์ค๋๋ค.
if depth == numbers.count {
answer.append(history)
return
}
๋ง์ฝ history๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ(A)์ด๋ฏ๋ก history์ ์ซ์๋ฅผ ๋ฃ์ด์ฃผ๊ณ depth๋ฅผ +1 ํด์ค ๋ค ์ฌ๊ทํด์ค๋๋ค.
if history.isEmpty {
for n in numbers[depth] {
var newHistory = history
newHistory.append(n)
dfs(numbers: numbers, depth: depth+1, answer: &answer, history: newHistory)
}
๋ง์ฝ history๊ฐ ๋น์ด์์ง ์๋ค๋ฉด ํ์ฌ depth์ ์ซ์๋ค์๋ฅผ ์ํํ๋ฉฐ history์ ๋งจ ๋ง์ง๋ง ์ซ์์ ํ์ฌ ์ซ์๊ฐ ํ์๋ ์ง์๊ฐ
์ฐ์๋์ง ์๋๋ค๋ฉด history์ ์ถ๊ฐํด์ฃผ๊ณ depth๋ฅผ +1 ์์ผ์ค๋๋ค.
else {
for n in numbers[depth] {
//๋ง์ง๋ง ์ซ์๊ฐ ์ง์๊ณ n์ด ํ์๋ผ๋ฉด
if history.last!%2 == 0 && n%2 != 0 {
var newHistory = history
newHistory.append(n)
dfs(numbers: numbers, depth: depth+1, answer: &answer, history: newHistory)
}
//๋ง์ง๋ง ์ซ์๊ฐ ํ์๊ณ n์ด ์ง์๋ผ๋ฉด
if history.last!%2 != 0 && n%2 == 0 {
var newHistory = history
newHistory.append(n)
dfs(numbers: numbers, depth: depth+1, answer: &answer, history: newHistory)
}
}
}
์ด๋ฐ์์ผ๋ก ๋ฐ๋ณตํ๊ณ ๋ชจ๋ ํ์์ด ๋๋ฌ์ ๋ answer๋ฅผ ์ถ๋ ฅํด์ฃผ๋ฉด ํ์์ ์ง์๊ฐ ์ฐ์๋์ง ์๋ ์ซ์๋ค์ ์กฐํฉ์ด ๋ด๊ฒจ์๋
๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค.
func solution(_ numbers:[[Int]]) {
var answer:[[Int]] = []
dfs(numbers: numbers, depth: 0, answer: &answer, history: [])
print(answer)
}
//[[1, 4, 7], [1, 4, 9], [1, 6, 7], [1, 6, 9], [2, 5, 8], [3, 4, 7], [3, 4, 9], [3, 6, 7], [3, 6, 9]]
Source Code
'๐ฅ Computer Science > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ์๊ฐ๋ณต์ก๋(Time-Complexity)๋? (feat. Big O) (0) | 2021.09.29 |
---|---|
[Algorithm] ์ฝ์ ์ ๋ ฌ(Insertion Sort) ์ด๋? (feat.Swift) (0) | 2021.09.28 |
[Algorithm] ์กฐํฉ(Combination)์ด๋? (feat.Swift) (0) | 2021.06.27 |
[Algorithm] ์์ด(Permutation)์ด๋? (feat.Swift) (0) | 2021.06.27 |
[Algorithm] ๋๋น์ฐ์ ํ์(BFS,Breadth-First-Search)๋?(feat.Swift) (0) | 2021.06.27 |
๋๊ธ