코딩테스트

[프로그래머스] 성격 유형 검사하기 (Kotlin)

깨비도 2024. 7. 11. 11:12

제목

(중략)

검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.
질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.

 

💡 풀이

class Solution {
    fun solution(survey: Array<String>, choices: IntArray): String {
        val choiceMap = mutableMapOf<String, 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,
        )
        
        for((idx, itm) in choices.withIndex()){ //withIndex 쓰면 for문에서 index값 접근 가능
            when(itm){ // 5, 3, 2, 7, 5 (choices의 값)
                1, 2, 3 -> {
                    val key = survey[idx][0].toString() // survey[idx][0]는 Char값이므로 String화
                    choiceMap[key] = choiceMap[key]!! + (4 - itm)
                }
                5, 6, 7 -> {
                    val key = survey[idx][1].toString()
                    choiceMap[key] = choiceMap[key]!! + (itm - 4)
                }
            }
        }
        
        val answer = with(StringBuilder()) {
            append(if(choiceMap["R"]!! < choiceMap["T"]!!) "T" else "R")
            append(if(choiceMap["C"]!! < choiceMap["F"]!!) "F" else "C")
            append(if(choiceMap["J"]!! < choiceMap["M"]!!) "M" else "J")
            append(if(choiceMap["A"]!! < choiceMap["N"]!!) "N" else "A")
            toString()
        }
        
        
        return answer
    }
}
  1. 각 성격유형에 맞는 Map을 하나 선언해준다. 각 key값의 value 초기값은 0이다.
  2. 사용자가 선택한 값 choices 배열을 반복문으로 순회한다. withIndex 메소드를 사용하면 for문에서도 index값에 접근이 가능하다.
    1. 만약 사용자가 선택한 값이 1, 2, 3 중에 있다면 survey의 0번째 값이 더 우세하다는 뜻이다.
      1. 때문에 survey의 idx 값의 0번째 값을 key로 선언한다. (이때 survye[idx][0]은 Char이므로 String화 해주어야 한다.)
      2. choiceMap의 key값은 현재 0으로 choiceMap[key]!! + (4 - itm) 해준다. 문제가 많아질 수록 같은 성격 타입을 검사하며 값이 누적될 수 있으므로 choiceMap[key]를 초반에 더해주고, 4는 잘모르겠음으로 4 - itm 해준다.
    2. 만약 사용자가 선택한 값이 5, 6, 7 중에 있다면 survey의 1번째 값이 더 우세하다는 뜻이다.
      1. 때문에 survey의 idx 값의 1번째 값을 key로 선언한다.
      2. choiceMap의 key값은 현재 0으로 choiceMap[key]!! + (itm - 4) 해준다. 문제가 많아질 수록 같은 성격 타입을 검사하며 값이 누적될 수 있으므로 choiceMap[key]를 초반에 더해주고, 4는 잘모르겠음으로 itm - 4 해준다.
  3.  answer는 StringBuilder를 with 메소드를 통해 선언한다.
    1. choiceMap["R"] 값과 choiceMap["T"]값을 비교하여 올바른 값을 return하여 append 메소드를 이용해 추가해준다.
    2. 이하 다른 타입들도 같은 방식으로 비교한다.
    3. toString()으로 최종 형변환을 해준다.

이번 문제도 풀이를 보고 풀었지만 문제 파악도 상당한 시간이 걸렸고 풀이도 제법 오래 분석했던 것 같다.

다양한 사람들의 다양한 방법 중에서도 가장 직관적이고 쉬운 방법으로 보여 이 풀이로 문제를 풀었는데, 제법 간단하고 쉽게 풀 수 있었다!