티스토리 뷰

코드카타

 

성격 유형 검사하기

 

문제

 

검사자의 선택지에 따라 각 성격유형에 점수를 할당하고

할당한 점수를 기반으로 성격유형을 반환한다.

 

 

입출력 예시

 

첫번째 테스트케이스의 성격 유형 검사결과는

{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 변환을 해야한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함