본문 바로가기
기타 알고리즘

Kotlin] 배달놀이하기

by 김마리님 2023. 11. 2.

(친구들끼리 게임하다가 만든 겁니다. 더 좋은 방식이 있다면 같이 연구해봅시다.)

 

서로 바쁜 친구들끼리 안부를 전하고자 서로 한 명씩 랜덤으로 지정해서 배달을 시켜주기로 했습니다. 

내가 본인에게 보낼 수 없으며, 친구는 무조건 한 명이 지정되어야 합니다. 이 때, 서로 다른 친구를 지목하는 알고리즘을 생성하세요.

 

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]}")
    }

}

 

 

이렇게 되면

삐 ==> 네
란 ==> 냥
네 ==> 삐
냥 ==> 란

 

이렇게 서로 다른 사람을 지목하는 결과를 얻을 수 있습니다.

반응형