[白俊-1043]うそをつく


質問リンク
fun main() {
    val bufferedReader = System.`in`.bufferedReader()
    val bufferedWriter = System.out.bufferedWriter()

    val (n, m) = bufferedReader.readLine().split(" ").map { it.toInt() }
    val detectors = Array(n + 1) { false }
    val parents = createParents(n)

    bufferedReader.readLine()
        .split(" ")
        .map { it.toInt() }
        .drop(1) // ▶ 진실을 아는 사람의 수는 무시
        .forEach {
            detectors[it] = true
        }

    val person = mutableListOf<Int>()
    repeat(m) {
        val parties = bufferedReader.readLine()
            .split(" ")
            .map { it.toInt() }
            .drop(1) // ▶ 파티에 오는 사람의 수는 무시
        person.add(parties[0])

        for (i in 1 until parties.size) {
            unionPeople(detectors, parents, parties[i - 1], parties[i])
        }
    }

    var answer = 0
    person.forEach {
        if (!detectors[getParent(parents, it)]) answer++
    }
    bufferedWriter.write("$answer")

    bufferedReader.close()
    bufferedWriter.close()
}

fun createParents(n: Int): Array<Int> {
    val array = Array(n + 1) { 0 }
    for (i in 1 until n + 1) {
        array[i] = i
    }
    return array
}

fun unionPeople(detectors: Array<Boolean>, peopleParent: Array<Int>, first: Int, second: Int) {
    val a = getParent(peopleParent, first)
    val b = getParent(peopleParent, second)
    if (detectors[a]) {
        peopleParent[b] = a
    } else {
        peopleParent[a] = b
    }
}

fun getParent(peopleParent: Array<Int>, first: Int): Int {
    if (peopleParent[first] == first) return first
    peopleParent[first] = getParent(peopleParent, peopleParent[first])
    return peopleParent[first]
}

アノテーションコードのない開発者の作成に力を入れています.
意図不明な(理解できない)コードがあれば、ご自由にお返事ください.本当にありがとうございます.