[Kotlin] 프로그래머스 - 신고 결과 받기

Kotlin

Language :

문제

링크

각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.

  • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
  • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.

k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.

  • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

제한사항

  • id_list의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다.
  • id_list에는 같은 아이디가 중복해서 들어있지 않습니다.
  • report의 원소는 "이용자id 신고한id"형태의 알파벳 소문자로만 이루어진 문자열입니다.
  • 이용자id와 신고한id는 공백(스페이스)하나로 구분되어 있습니다.
  • 자기 자신을 신고하는 경우는 없습니다.
  • return 하는 배열은 id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.

입출력 예시

입출력 예 #1

  • 입력
  • id_list: ["muzi", "frodo", "apeach", "neo"]
  • report: ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
  • k: 2
  • 출력 [2,1,1,0]

입출력 예 #2

  • 입력
  • id_list: ["con", "ryan"]
  • report: ["ryan con", "ryan con", "ryan con", "ryan con"]
  • k: 3
  • 출력: [0,0]

제한시간

정확성 테스트 : 10초

코드 1

class Solution {
    fun solution(idList: Array<String>, report: Array<String>, k: Int): IntArray {
        // 신고받은 내역 - 중복 불가
        val targetReport = mutableMapOf<String, MutableSet<String>>()
        // distinct()를 사용하면 List, Set 모두 최소 29초 걸리는데 distinct 없이 Set만 사용하면 최소 12초 걸림
        report.forEach {
            val (reporter, target) = it.split(" ")
            targetReport[target] = targetReport.getOrDefault(target, mutableSetOf())
            targetReport[target]?.add(reporter)
        }

        // 메일 내역
        val userSendMail = mutableMapOf<String, Int>()
        // 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송
        targetReport
            .filter { it.value.count() >= k }
            .forEach {
                it.value.forEach { userId ->
                    userSendMail[userId] = userSendMail.getOrDefault(userId, 0) + 1
                }
            }
        return idList.map { userSendMail.getOrDefault(it, 0) }.toIntArray()
    }
}
테스트 1 〉	통과 (13.21ms, 61.5MB)
테스트 2 〉	통과 (13.10ms, 62.1MB)
테스트 3 〉	통과 (154.73ms, 143MB)
테스트 4 〉	통과 (12.99ms, 62.2MB)
테스트 5 〉	통과 (14.77ms, 62.3MB)
테스트 6 〉	통과 (23.58ms, 64.5MB)
테스트 7 〉	통과 (20.77ms, 70.6MB)
테스트 8 〉	통과 (44.83ms, 84.6MB)
테스트 9 〉	통과 (126.78ms, 111MB)
테스트 10 〉	통과 (95.07ms, 117MB)
테스트 11 〉	통과 (161.39ms, 150MB)
테스트 12 〉	통과 (16.92ms, 61.9MB)
테스트 13 〉	통과 (18.50ms, 62MB)
테스트 14 〉	통과 (139.77ms, 119MB)
테스트 15 〉	통과 (170.33ms, 148MB)
테스트 16 〉	통과 (14.17ms, 62.9MB)
테스트 17 〉	통과 (22.37ms, 62MB)
테스트 18 〉	통과 (20.16ms, 62.7MB)
테스트 19 〉	통과 (26.16ms, 62.4MB)
테스트 20 〉	통과 (113.04ms, 116MB)
테스트 21 〉	통과 (211.26ms, 141MB)
테스트 22 〉	통과 (12.85ms, 61.2MB)
테스트 23 〉	통과 (12.81ms, 62.1MB)
테스트 24 〉	통과 (13.11ms, 61.2MB)

코드 2

  class Solution {
    fun solution(idList: Array<String>, report: Array<String>, k: Int): IntArray =
        report.distinct() // 중복 신고 제거
            .map { it.split(" ") }
            .groupBy { it[1] } // 유저별 신고받은 내역
            .filter { it.value.size >= k } // 신고 내역 k건 이상
            .map { a -> a.value.map { it[0] } } // 신고자 추출
            .flatten() // 그룹 해제
            .groupingBy { it }.eachCount()
            .run { idList.map { getOrDefault(it, 0) } }.toIntArray()
}
테스트 1 〉	통과 (35.51ms, 65.4MB)
테스트 2 〉	통과 (28.79ms, 65.3MB)
테스트 3 〉      통과 (31.91ms, 65.8MB)
테스트 5 〉	통과 (44.67ms, 65.6MB)
테스트 6 〉	통과 (40.54ms, 65.4MB)
테스트 7 〉	통과 (39.13ms, 72.6MB)
테스트 8 〉	통과 (39.47ms, 83.5MB)
테스트 9 〉	통과 (150.46ms, 131MB)
테스트 10 〉	통과 (101.38ms, 113MB)
테스트 11 〉	통과 (234.00ms, 179MB)
테스트 12 〉	통과 (35.69ms, 67MB)
테스트 13 〉	통과 (41.59ms, 65.5MB)
테스트 14 〉	통과 (139.25ms, 119MB)
테스트 15 〉	통과 (130.72ms, 130MB)
테스트 16 〉	통과 (30.91ms, 66.7MB)
테스트 17 〉	통과 (34.17ms, 66MB)
테스트 18 〉	통과 (40.42ms, 66MB)
테스트 19 〉	통과 (49.65ms, 66.5MB)
테스트 20 〉	통과 (124.52ms, 116MB)
테스트 21 〉	통과 (175.12ms, 128MB)
테스트 22 〉	통과 (29.46ms, 64.8MB)
테스트 23 〉	통과 (30.37ms, 65.5MB)
테스트 24 〉	통과 (30.01ms, 65.4MB)

민갤

Back-End Developer

백엔드 개발자입니다.