티스토리 뷰
코드카타
신고 결과 받기
문제
신고한 유저에게 날라갈 정지메일 수의 리스트를 반환하는 문제이다.
동일한 유저에 대한 신고 횟수는 1회로 처리되므로 신고 내역 리스트는 중복처리가 필요하다.
테스트케이스
따로 추가할 테스트케이스는 없는 것 같다.
풀이
class Solution {
fun solution(id_list: Array<String>, report: Array<String>, k: Int): List<Int> {
// 동일한 유저에 대한 신고는 한 번으로 제한되므로 중복된 신고내역 제거
var reportSet = report.toSet()
// 신고당한 유저들을 저장할 맵 (키: 신고 당한 사람, 값: 신고 당한 횟수)
var reportMap = mutableMapOf<String, Int>()
// 신고당한 사람들을 찾아 신고 당한 횟수를 저장한다
reportSet.forEach{
val key = it.split(' ')[1] // 신고 당한 사람 이름
reportMap[key] = reportMap.getOrDefault(key, 0) + 1 // 신고횟수 1추가
}
// 정지당한 이용자로 구성되어 있는 맵
var stopMap = reportMap.filterValues { it >= k }
// 메일을 보낼 신고자들을 저장할 맵 (키: 신고자 이름, 값: 메일 보낼 횟수)
var resMap = mutableMapOf<String, Int>()
// 유저수만큼 키를 생성하고 모든 키값을 0으로 초기화한다
id_list.forEach { resMap[it] = 0 }
// 신고자에게 보낼 메일 갯수를 저장한다
reportSet.forEach {
val key = it.split(' ')[0] // 신고자 이름
if (stopMap.contains(it.split(' ')[1])) { // 신고당한 사람이 정지대상이라면
resMap[key] = resMap.getOrDefault(key, 0) + 1 // 해당 신고자에게 보낼 메일 횟수 1증가
}
}
return resMap.values.toList() // 결과 맵의 키값들을 리스트로 변환하여 반환한다
}
}
신고 당한 사람들의 신고 누적 횟수를 저장할 맵과
신고자들에게 보낼 메일 횟수를 저장할 맵을 선언하여 문제를 해결하면 된다.
맵을 리스트로 변환하기
val map = mapOf("a" to 1, "b" to 2, "c" to 3)
val keyList = map.keys.toList() // 출력: [a, b, c]
val valueList = map.values.toList() // 출력: [1, 2, 3]
val entryList = map.entries.toList() // 출력: [a=1, b=2, c=3]
맵의 키나 값만 가져와서 리스트르 변환할 수도 있고,
맵의 엔트리(Map의 각 키-값 쌍을 나타내는 객체)를 리스트로 변환할 수도 있다.
회고
해당 문제를 해결하려면 맵을 써야한다는 느낌은 있었는데
어떤 맵을 생성해서 어떤 키-값으로 초기화 해야하는지 감을 잡기가 어려웠던 것 같다.
맵은 여러 개의 값이 담긴 요소를 가지고 있는 리스트를 다룰 때 유용하게 쓸 수 있다.
이번 문제를 풀어보며 맵을 다루는 숙련도가 좀 올라간 느낌이고,
비슷한 유형의 문제가 나오면 맵을 어떤식으로 구성할지를 우선적으로 생각해봐야겠다.
'내일배움캠프 > Android 국비지원' 카테고리의 다른 글
TIL 13일차 (JadenCase 문자열 만들기 - Kotlin | 연산자 간의 우선순위를 고려한 연산 로직짜기) (0) | 2024.06.08 |
---|---|
TIL 12일차 (최댓값과 최솟값 - Kotlin | 단계별 계산기 클래스 구현) (0) | 2024.06.07 |
TIL 10일차 (공원산책 - Kotlin | 객체지향 프로그래밍 관련 개념 정리) (0) | 2024.06.05 |
TIL 9일차 (달리기 경주 - Kotlin | 코틀린 기초 복습) (0) | 2024.06.04 |
TIL 8일차 (개인정보 수집 유효기간 - Kotlin | Android Studio 단축키 정리) (0) | 2024.06.03 |