본문 바로가기

TLI/코드카타

2024.06.06 TIL 코트카타 74번(신고 결과 받기)

    fun solution(id_list: Array<String>, report: Array<String>, k: Int): IntArray {

        val reporterToTarget = mutableMapOf<String, MutableSet<String>>()
        for(complaint in report) {
            val splitComplaint = complaint.split(" ")
            val reporter = splitComplaint[0]
            val target = splitComplaint[1]
            val targetSet = reporterToTarget[reporter]
            if(targetSet == null)
                reporterToTarget[reporter] = mutableSetOf(target)
             else
                targetSet.add(target)
        }

        val reporterIter = reporterToTarget.entries.iterator()
        val targetToCount = mutableMapOf<String, Int>()
        while (reporterIter.hasNext()) {
            val targetIter = reporterIter.next().value.iterator()
            while (targetIter.hasNext()) {
                val target = targetIter.next()
                targetToCount[target] = targetToCount.getOrDefault(target, 0) + 1
            }
        }

        val answer = IntArray(id_list.size)

        for(idIndex in id_list.indices) {
            val id = id_list[idIndex]
            val targets = reporterToTarget[id]
            var numOverK = 0
            if(targets != null) {
                val targetIter = targets.iterator()
                while (targetIter.hasNext()) {
                    val target = targetIter.next()
                    if(targetToCount[target]!! >= k) {
                        numOverK++
                    }
                }
            }
            answer[idIndex] = numOverK
        }

        return answer
    }

 

풀이과정

1. reporterToTarget(key : 신고자, target : 피신고자)을 만들어 접수 내용을 정리한다.

   1.1. target은 set으로 만들어서 한명의 신고자가 한 명의 신고를 여러 번 했을 때 중복을 제거한다.

2. reporterToTarget 맵을 다 만들어서 신고당한사람이 몇 번 당했는지 count하는 맵(targetToCount)를 만든다.

3. 다시 reporterToTarget을 iterator로 순회하면서 targetToCount에서 확인해 본인이 신고한 사람 중 신고 횟수가 k이상이 사람을 카운트한다.

 

포인트

- reporterToTarget에서 target을 set으로 만들어 한 신고자가 한 명의 피 신고자를 여러 번 신고하는 것에 중복을 제거한다.