์๋ ํ์ธ์ Foma ๐ ์ ๋๋ค!
์ค๋์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์ ์ ๋ง ๋น๋ฒํ๊ฒ ์ฌ์ฉ๋๋ "์กฐํฉ" ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
์กฐํฉ์ด๋?
n๊ฐ์ ์์์์ r ๊ฐ์ ์์๋ฅผ ์์์ ์๊ด์์ด ๋ฝ๋ ๊ฒฝ์ฐ์ ์ - ๋๋ฌด ์ํค -
์์ด๊ณผ ๋ค๋ฅด๊ฒ ์์๋ ์ค์ํ์ง ์์์.
์ฝ๊ฒ ์ค๋ช ํ๋ฉด ๋ฌผ๊ฑด์ ์ฌ๊ณ ์ด ๊ฐ๊ฒฉ์ ๊ตฌํ๋ ๊ฒ๊ณผ ๋น์ทํด์.
๊ณผ์ผ๋ก ์๋ฅผ ๋ค๋ฉด ์ฌ๊ณผ,ํฌ๋,์๋ฐ์ด ์๋ค๋ฉด
์ฌ๊ณผ,ํฌ๋,์๋ฐ
ํฌ๋,์ฌ๊ณผ,์๋ฐ
์๋ฐ,์ฌ๊ณผ,ํฌ๋
... ๋ฑ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฌ๋ ์ด ๊ฐ๊ฒฉ์ ๋๊ฐ๊ฒ ์ฃ ?
์ฆ, ์ด๋ฃจ์ด์ง ๊ณผ์ผ์ด ๋๊ฐ๋ค๋ฉด ํ๋์ ์กฐํฉ์ผ๋ก ์๊ฐํ๋ ๊ฒ์ ๋๋ค.
์ฝ๋ ๊ตฌํ
๋จผ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ด์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋๋ค.
var cases:[[Int]] = []
combination์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํด์ฃผ๋๋ฐ
์ธ๋ฑ์ค๋ค์ ๋ด๊ณ ์๋ indexes
๋ฝ์์ผํ ๊ฐฏ์๋ฅผ ์ ํ pickCount
ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ํ์ํ current
๋ฝ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ picked
๋ก ๋ฐ์์ค๋๋ค.
func combination(indexes: [Int], pickCount: Int, current: Int, picked: [Int]) {...}
๋ง์ฝ ํ์ฌ ์ธ๋ฑ์ค๊ฐ ๋ฝ์์ผ ํ ์ธ๋ฑ์ค๊น์ง ์๋ค๋ฉด cases์ picked๋ฅผ ๋ฃ์ด์ค๋๋ค.
if current == pickCount {
cases.append(picked)
return
}
indexes๋ฅผ ์ํํ๋ฉด์ ๋ฐฉ๋ฌธํ ๊ณณ์ true๋ก ํด์ฃผ๊ณ ์๋กญ๊ฒ ๋ฝ์ ์ซ์๋ค์ ๋ฃ์ด ์ฌ๊ทํด์ค๋๋ค.
indexes
.enumerated()
.forEach{
if !initialVisited[$0.offset] {
initialVisited[$0.offset] = true
var newPicked = picked
newPicked.append($0.element)
combination(indexes: indexes, pickCount: pickCount, current: current+1, picked: newPicked,visited: initialVisited)
}
}
์๋์ ๊ฐ์ด ์ํ๋ ์กฐ๊ฑด์ผ๋ก ์คํ์ํค๋ฉด ์๋์ ๊ฐ์ด ์กฐ๊ฑด์ ๋ง๊ฒ ์กฐํฉ๋ค์ด ์ถ๋ ฅ๋๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
combination(indexes: [1,2,3,4,5], pickCount: 3, current: 0, picked: [], visited: [])
print(cases)
//[[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3, 5], [1, 4, 5], [2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5]]
์ ์ฒด ์์ค ์ฝ๋
๋๊ธ