[프로그래머스] 주사위 게임 3

devel_liz·2024년 12월 18일
1

코딩테스트

목록 보기
28/45

🗒 문제



📝 나의 문제풀이

class Solution {
    fun solution(a: Int, b: Int, c: Int, d: Int): Int {
        val list = listOf(a, b, c, d)
        val group = list.groupBy{ it }
  
        return when(group.size){
            1 -> 1111 * a
            2 -> { 
               val (key1, key2) = group.keys.toList()
               if(group[key1]?.size == 3){
                   (10 * key1 + key2) * (10 * key1 + key2)
               }else if(group[key2]?.size == 3){
                   (10 * key2 + key1) * (10 * key2 + key1)
               }else {
                   (key1 + key2) * Math.abs(key1 - key2)
               }
           }
               3 -> {
                   val(q, r) = group.keys.toList().filter{ group[it]?.size == 1}
               q * r
           }
           else -> list.minOrNull() ?: -1
       }


    }
}

📝 다른 사람의 문제 풀이

import kotlin.math.*

class Solution {
    fun solution(a: Int, b: Int, c: Int, d: Int): Int {
        val map = listOf(a, b, c, d).groupingBy { it }.eachCount()
        return when (map.maxOf { it.value }) {
            4 -> a * 1111

            3 -> {
                val p = map.entries.first { it.value == 3 }.key
                val q = map.entries.first { it.value == 1 }.key
                (10 * p + q).let { it * it }
            }

            2 -> {
                if (map.size == 2) {
                    val p = map.entries.first { it.value == 2 }.key
                    val q = map.entries.last { it.value == 2 }.key
                    (p + q) * abs(p - q)
                } else {
                    map.entries.filter { it.value != 2 }
                        .map { it.key }
                        .reduce { acc, n -> acc * n }
                }
            }

            else -> map.minOf { it.key }
        }
    }
}

🖊 문제 풀이 시 알면 좋을 것

  • groupBy()

    • 컬렉션의 요소들을 특정 조건에 따라 그룹으로 묶어 Map으로 반환.
      val names = listOf("Alice", "Bob", "Charlie", "David")
      val groupedByFirstLetter = names.groupBy { it.first() }
      // 결과: {A=[Alice], B=[Bob], C=[Charlie], D=[David]}
  • groupingBy()

    • 그룹화 처리를 위한 Grouping 객체를 생성. 추가로 집계(fold, reduce, eachCount) 가능.
      val names = listOf("Alice", "Bob", "Alice", "Charlie")
      val grouping = names.groupingBy { it }
      val count = grouping.eachCount()
      // 결과: {Alice=2, Bob=1, Charlie=1}

*잠깐!
groupBy()groupingBy()랑 어떻게 다른지 자세히 설명해줘!

구분groupBygroupingBy
반환 값즉시 Map 반환추가 처리를 위한 Grouping 객체 반환
결과 출력 방식바로 사용 가능추가 처리가 필요
사용 목적그룹화 결과가 즉시 필요할 때그룹화 후 추가 작업(예: 합산, 필터링)


  • eachCount()

    • groupingBy에서 생성된 Grouping 객체의 요소 개수를 계산.
      val names = listOf("Alice", "Bob", "Alice")
      val count = names.groupingBy { it }.eachCount()
      // 결과: {Alice=2, Bob=1}
  • maxOf

    • 컬렉션의 요소에서 특정 기준에 따른 최대값 반환.
      val numbers = listOf(1, 2, 3, 4)
      val max = numbers.maxOf { it }
      // 결과: 4
  • entries

    • Map에서 키-값 쌍의 목록(Map.Entry)을 반환.
      val map = mapOf("Alice" to 25, "Bob" to 30)
      val entries = map.entries
      // 결과: [Alice=25, Bob=30]
  • abs()

    • 숫자의 절대값(양수로 변환된 값)을 반환.
      val number = -10
      val absolute = abs(number)
      // 결과: 10
  • reduce

    • 컬렉션의 요소를 순차적으로 누적하여 단일 값으로 만듦.
      val numbers = listOf(1, 2, 3, 4)
      val sum = numbers.reduce { acc, num -> acc + num }
      // 결과: 10
  • minOf

    • 컬렉션의 요소에서 특정 기준에 따른 최소값 반환.
      val numbers = listOf(1, 2, 3, 4)
      val min = numbers.minOf { it }
      // 결과: 1

📌 마치며

문제에 |p-q|에서 ||를 두는 것이 절대값이라는 것을 모르고 절대값을 고려 안 하고 문제를 제출하여 계속해서 실패하는 케이스가 발생하여 애먹었다. 문제에는 이유없이 쓴 것들이 없다. ||처럼 모르는 기호가 나오면 확인하고 문제를 풀어야겠다.

profile
Android zizon

0개의 댓글

관련 채용 정보