본문 바로가기
note/language-kotlin

[programmers] Lv.1 신고 결과 받기(Kotlin 공부용)

by 눈부신음표 2022. 5. 8.
728x90

kotlin을 공부하면서 문법을 하나하나 하는것보다 c++로 풀었던것을 다시 kotlin으로 풀어보는것이 도움이 되지 않을까 해서 다른 분들의 코드를 해석하는것을 시작하였다.

(문제시 삭제하겠음)

 

문제

https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr


참고 코드

https://velog.io/@nightlyherb/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%8B%A0%EA%B3%A0-%EA%B2%B0%EA%B3%BC-%EB%B0%9B%EA%B8%B0-in-Kotlin

 

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

Kotlin에서 Collection을 사용해보았고, Collection 의 Transformation에서 몇몇 관용구를 사용해보았습니다.

velog.io

728x90

 

해석

첫 코틀린 경험 후기: 신기하다...

class Solution {
    fun solution(id_list: Array<String>, report: Array<String>, k: Int): IntArray {
        val reporterAndTarget = report.map{val reporterId = it.substringBefore(' ') // ' '기준으로 나눔
                                            val targetId = it.substringAfter(' ')
                                            Pair(reporterId, targetId)}.distinct()
        // 한 유저를여러번 신고할 수 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리된다. => distinct()
        
        for((reporter, target) in reporterAndTarget)
            println(reporter + " " + target)
            
                                            // groupingBy는 groupBy + 연산하는 용도
                                            // targetId별로 grouping
        val suspendedId = reporterAndTarget.groupingBy{(_, targetId) -> targetId}
                                            .eachCount() // 각 요소를 count해서
                                            .filter{it.value >= k} // k이상인 것들을 filtering
                                            .keys // 그것의 key값들을 대입
        
        println(suspendedId)
        
                                                    // targetId가 suspendedId에 속하는것을 filtering
        val reporterIdToSendMail = reporterAndTarget.filter{(_, targetId) -> targetId in suspendedId}
                                                    // reporter로 grouping
                                                    .groupingBy{(reporterId, _) -> reporterId}
                                                    .eachCount() // reporter가 메일 받는 횟수
        
        println(reporterIdToSendMail)
                                                    
        // getOrDefault : 지정된 키에 해당하는 값을 반환하거나 이러한 키가 map에 없는 경우 defaultValue를 반환
        return id_list.map{reporterIdToSendMail.getOrDefault(it, 0)} // 여기까진 List
                      .toIntArray() // 이걸 해줘야 IntArray가 됨
    }
}
728x90

댓글