์๋ ํ์ธ์ Foma ๐ ์ ๋๋ค!
์ค๋์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์ ์ ๋ง ๋น๋ฒํ๊ฒ ์ฌ์ฉ๋๋ "์์ด"์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์!
์์ด์ด๋?
์๋ก ๋ค๋ฅธ n๊ฐ์ ์์์์ r๊ฐ๋ฅผ ์ค๋ณต์์ด ๊ณจ๋ผ ์์์ ์๊ด์๊ฒ ๋์ดํ๋ ๊ฒ์ ์ด๋ฅธ๋ค. - ๋๋ฌด ์ํค -
์ฝ๊ฒ ์ค๋ช ํ๋ฉด ์ค ์ธ์ฐ๊ธฐ์ ๋๊ฐ์์.
A,B,C๋ผ๋ ํ์์ ์ค ์ธ์ฐ๋ ๋ฐฉ๋ฒ์ ABC,ACB,BAC,BCA,CAB,CBA ๋ฑ์ด ์๊ฒ ์ฃ ?
์ด ์ค์์ 2๋ช ์ ํ์์ผ๋ก ์ค ์ธ์ฐ๋ ๋ฐฉ๋ฒ์ AB,AC,BA,BC,CA,CB ๋ฑ์ด ์์๊ฑฐ์์.
์ฝ๋ ๊ตฌํ
๊ฒฝ์ฐ์ ์๋ค์ ๋ด์ ์ด์ค ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋๋ค.
var cases:[[Int]] = []
๋ช ๊ฐ๋ฅผ ๋ฝ์์ง ์ ํด์ค๋๋ค.
let pickCount = 3
๋ณธ๊ฒฉ์ ์ผ๋ก ์์ด ํจ์๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
ํ๋ผ๋ฏธํฐ๋ก๋
์ ์ฒด ์ธ๋ฑ์ค๊ฐ ๋ด๊ธด numbers
ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ผ current
๋ช๊ฐ๋ฅผ ๋ฝ์์ผ ํ ์ง๋ฅผ ์ ํ pickCount
๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ๋ํ๋ผ visited
๋ฝ์ ์ธ๋ฑ์ค๋ฅผ ๋ด์ picked ๋ก ์ค์ ํด์ค๋๋ค.
func permutaion(indexes:[Int],current:Int,pickCount:Int,visited:[Bool],picked:[Int]) {...}
๊ทธ๋ฆฌ๊ณค ์ด๊ธฐ ๋ฐฉ๋ฌธ์ด ๋น์ด์๋ค๋ฉด ์ธ๋ฑ์ค์ ๊ฐฏ์๋งํผ ์ด๊ธฐ ๋ฐฉ๋ฌธ์ ์ค์ ํด์ค๋๋ค.
let initialVisited = visited.isEmpty ? Array(repeating: false, count: indexes.count) : visited
๋ง์ฝ ํ์ฌ ์ธ๋ฑ์ค๊ฐ pickCount๋ผ๋ฉด cases์ ๋ด๊ณ return ํด์ค๋๋ค.
if current == pickCount {
cases.append(picked)
return
}
๋ง์ฝ ์ธ๋ฑ์ค๊ฐ pickCount ์ ์ด๋ผ๋ฉด
indexes๋ฅผ ์ํํ๋ฉฐ ๋ฐฉ๋ฌธํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํด์
๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ๋ฐฉ๋ฌธ์ ์ฒดํฌํ๊ณ ์๋ก์ด ์ธ๋ฑ์ค๋ฅผ ๋ฃ๊ณ ํ์ฌ ์ธ๋ฑ์ค์ + 1 ํด์ฃผ๊ณ
์ฌ๊ทํ์ฌ ์ค๋๋ค.
indexes
.enumerated()
.forEach{
if !initialVisited[$0.offset] {
var newVisited = initialVisited
newVisited[$0.offset] = true
var newPicked = picked
newPicked.append($0.element)
permutaion(indexes: indexes, current: current+1, pickCount: pickCount,visited: newVisited,picked: newPicked)
}
}
์๋์ ๊ฐ์ด ์ํ๋ ์กฐ๊ฑด์ ๋ฃ๊ณ ๊ฒฝ์ฐ์ ์๋ค์ ์ถ๋ ฅํด๋ณด๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋ด๊ธด ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
permutaion(indexes: [1,2,3], current: 0,pickCount: 2,visited:[],picked: [])
print(cases)
//[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
์ ์ฒด ์์ค ์ฝ๋
๋๊ธ