티스토리 뷰
코드카타
성격 유형 검사하기
문제
검사자의 선택지에 따라 각 성격유형에 점수를 할당하고
할당한 점수를 기반으로 성격유형을 반환한다.
입출력 예시
첫번째 테스트케이스의 성격 유형 검사결과는
{R=0, T=3, C=1, F=0, J=0, M=2, A=1, N=1} 의 값을 가진다.
앞에서 부터 성격 지표를 2개씩 묶어서 점수가 높은 쪽의 성격 유형을 반환하고
두 성격 유형의 점수가 같으면 앞에 위치한 성격유형을 반환하므로 "TCMA"를 반환한다
풀이
class Solution {
fun solution(survey: Array<String>, choices: IntArray): String {
// 성격 유형별로 점수를 저장할 맵 선언
val map = mutableMapOf<Char, Int>(
'R' to 0,
'T' to 0,
'C' to 0,
'F' to 0,
'J' to 0,
'M' to 0,
'A' to 0,
'N' to 0
)
// 설문자의 선택에 따른 점수를 반환 함수
fun getScore(cn: Int): Int {
return when (cn) {
1 -> 3
2 -> 2
3 -> 1
5 -> 1
6 -> 2
7 -> 3
else -> 0
}
}
// 맵에 값을 추가하는 함수
fun MutableMap<Char, Int>.addValue(key: Char, plus: Int) {
this[key] = this.getOrDefault(key, 0) + plus
}
// 설문조사 결과 바탕으로 맵에 점수를 추가
for (i in survey.indices) {
// 선택지가 5미만의 값을 가지면 첫번째 성격에 아니면 두번째 성격에 점수 추가
if(choices[i]<5) map.addValue(survey[i][0], getScore(choices[i]))
else map.addValue(survey[i][1], getScore(choices[i]))
}
// 최종 성격 유형을 저장할 변수
var res = ""
// 성격 유형을 순서대로 2개씩 비교해서 결과 문자열 생성
for (i in 0 until map.keys.size step 2) {
// 해당 맵의 키 가져오기 (Char)
val firstKey = map.keys.elementAt(i)
val secondKey = map.keys.elementAt(i + 1)
// 키값 선언 (null 처리 필수)
val firstValue = map[firstKey] ?: 0
val secondValue = map[secondKey] ?: 0
// 값이 큰 성격 유형을 res에 추가
// 두 성격 유형의 점수가 같다면 첫번째 성격유형을 res에 추가
if(firstValue >= secondValue) res += firstKey.toString()
else res += secondKey.toString()
}
return res
}
}
map을 이용해서 문제를 풀 수 있다.
Map
Map이란?
// 키는 Char, 값은 Int형으로 지정
val map = mutableMapOf<Char, Int>('A' to 0, 'B' to 0, 'C' to 0)
print(map) // {A=0, B=0, C=0}
코틀린에서의 맵(Map)은 키(Key)와 값(Value)의 쌍(Pair)을 저장하는 컬렉션이다.
맵은 중복된 키를 가질 수 없기에 키는 유일하다는 특징이 있다.
해당 컬렉션은 키를 기반으로 값을 불러오거나 변경할 수 있다.
Map 선언하기
// 불변형 맵 선언
val map: Map<String, Int> = mapOf("A" to 1, "B" to 2, "C" to 3)
// 가변형 맵 선언
val mutableMap: MutableMap<String, Int> = mutableMapOf("A" to 1, "B" to 2, "C" to 3)
// 불변형 빈 맵 선언
val emptyMap: Map<String, Int> = emptyMap()
// 사변형 빈 맵 선언
val emptyMutableMap: MutableMap<String, Int> = mutableMapOf()
여타 다른 컬렉션과 마찬가지로 가변형과 불변형 선언 방식이 존재한다.
Map에 값 추가하는 함수
fun <K> MutableMap<K, Int>.addValue(key: K, plus: Int) {
this[key] = this.getOrDefault(key, 0) + plus
}
위 문제풀이에서 쓰인 함수와 다르게 맵의 키값이 어떤 자료형이든
맵의 특정 키값에 값을 추가할 수 있는 함수이다.
fun <K> < 해당 함수가 제네릭 타입 'K'를 사용할 것임을 선언한다.
제네릭 타입 K는 해당 함수가 호출될 때 맵의 키 타입으로 대체된다.
해당 함수에서 this는 확장 함수가 호출된 MutableMap 인스턴스를 가리킨다.
맵의 특정 키에다 값을 추가하려면 맵의 키값을 읽어와서
키 값이 null일 때의 반환할 값과 추가할 값을 더한 값으로 초기화 해줘야 한다.
키 삭제하기
val map = mutableMapOf<Char, Int>('A' to 0, 'B' to 0, 'C' to 0)
map.remove('A')
println(map) // {B=0, C=0}
remove(키) 메소드로 맵의 키를 삭제할 수 있다.
키값 수정하기
map['A'] = 3
println(map) // {A=3, B=0, C=0}
map[키] 로 키값을 불러오고 키값을 초기화한다.
Map 비우기
map.clear()
println(map) // {}
clear() 메소드로 맵의 모든 키를 삭제한다.
키 개수 세기
println(map.count()) // 3
count() 메서드로 맵의 키 개수를 셀 수 있다.
특정조건에 해당하는 Map 반환
val map = mapOf<Char, Int>('A' to 0, 'B' to 1, 'C' to 2)
println(map.filterKeys{it == 'A'}) // {A=0}
println(map.filterValues{it == 1}) // {B=1}
println(map.filter{it.key == 'C' && it.value == 2}) // {C=2}
filter{} 메서드를 통해 특정조건에 해당하는 Map을 만들 수 있다.
Map에서 반복문 돌리기
val map = mapOf<Char, Int>('A' to 0, 'B' to 1, 'C' to 2)
// forEach
map.forEach { key, value -> println("${key}의 값은 ${value}이다")}
// for loop
for((key, value) in map){
println("${key}의 값은 ${value}이다")
}
// A의 값은 0이다
// B의 값은 1이다
// C의 값은 2이다
리스트에서 for문을 돌렸을 때 i가 해당 리스트의 요소를 값으로 가지는 것과 다르게
Map에서 for문을 돌리면 key와 value값을 2개를 활용하게 된다.
Map 정렬하기
val map = mapOf<Char, Int>('A' to 1, 'B' to 2, 'C' to 3)
// key를 기준으로 정렬
print(map.toSortedMap (compareBy{it})) // {A=1, B=2, C=3}
print(map.toSortedMap(compareByDescending {it})) // {C=3, B=2, A=1}
val map2 = mapOf<Char, Int>('C' to 1, 'B' to 2, 'A' to 3)
// value를 기준으로 정렬
print(map2.toList().sortedBy {it.second}.toMap()) // {C=1, B=2, A=3}
print(map2.toList().sortedByDescending {it.second}.toMap()) // {A=3, B=2, C=1}
각 print 구문마다 map의 오름차순 정렬과 내림차순 정렬을 진행한다.
map을 value값 기준으로 정렬하기 위해선 list 변환 > 값 정렬 > Map 변환을 해야한다.
'내일배움캠프 > Android 국비지원' 카테고리의 다른 글
TIL 8일차 (개인정보 수집 유효기간 - Kotlin | Android Studio 단축키 정리) (0) | 2024.06.03 |
---|---|
TIL 7일차 (바탕화면 정리 - Kotlin) (0) | 2024.06.02 |
9 to 9 개발 공부 1주일동안 해본 소감 (0) | 2024.05.31 |
TIL 5일차 (햄버거 만들기 - Kotlin | StringBuilder 알아보기 | KPT 회고록 작성) (0) | 2024.05.31 |
TIL 4일차 (둘만의 암호 - Kotlin | 팀원 소개 앱 개발 과정 정리) (0) | 2024.05.30 |