(친구들끼리 게임하다가 만든 겁니다. 더 좋은 방식이 있다면 같이 연구해봅시다.)
서로 바쁜 친구들끼리 안부를 전하고자 서로 한 명씩 랜덤으로 지정해서 배달을 시켜주기로 했습니다.
내가 본인에게 보낼 수 없으며, 친구는 무조건 한 명이 지정되어야 합니다. 이 때, 서로 다른 친구를 지목하는 알고리즘을 생성하세요.
1. 친구는 2명 이상 10명 미만입니다.
2. 중복되는 친구는 없습니다. 모두 다 다른 이름의 친구입니다.
이 알고리즘의 경우, 똑같은 크기의 배열을 두고 내 자리를 제외한 랜덤으로 빈 자리를 찾아가도록 유도하면 됩니다.
이 때, 자리가 채워졌을 경우 해당 자리를 제외하고 남은 자리를 고르도록 합니다.
예외상황이 있는데, 앞서 모든 사람들이 자리를 차지해버려 마지막 남은 한 사람이 자기 자신을 선택해야 할 때가 있는데, 이럴 때 첫번째 사람과 자리를 변경하면 모든 사람이 랜덤한 사람을 선택하게 됩니다.
이를 코드로 표현하면 ...
import kotlin.concurrent.thread
var array = mutableListOf("삐", "란", "네", "냥")
fun main(args: Array<String>) {
randomArray()
}
fun randomArray() {
var cloneArray = array.toMutableList()
var array = MutableList(cloneArray.count()) { it }
var selectedArray = MutableList(cloneArray.count()) { "" }
cloneArray.forEachIndexed { index, s ->
var filterArray = array.filter{ it != index }
if (filterArray.isEmpty()) {
var selectedIndex = index
selectedArray[index] = selectedArray[0]
selectedArray[0] = s
array.remove(selectedIndex)
} else {
var selectedIndex = filterArray.random()
selectedArray[selectedIndex] = s
array.remove(selectedIndex)
}
}
for (i in selectedArray.indices) {
println("${cloneArray[i]} ==> ${selectedArray[i]}")
}
}
이렇게 되면
삐 ==> 네
란 ==> 냥
네 ==> 삐
냥 ==> 란
이렇게 서로 다른 사람을 지목하는 결과를 얻을 수 있습니다.
반응형