본문 바로가기
스터디(programmers)

Kotlin] 프로그래머스 lv.2, 귤 고르기

by 김마리님 2023. 3. 29.

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

더보기

최소의 종류로 과일을 담는다 = 제일 많이 생산된 과일 순으로 채운다

 

즉, 종류별로 갯수를 찾은 다음, 이를 내림차순으로 정렬하고, 과일 갯수만큼 빼버리면 됨~

class Solution {
    fun solution(k: Int, tangerine: IntArray): Int {

        var answer = k
        var count = 0

        var tangerineSize = tangerine.distinct()
        var tangerineCount = IntArray(tangerineSize.size)

        tangerineSize.forEachIndexed { index, i ->
            tangerineCount[index] = test(tangerine, i)
        }

        tangerineCount.sortedDescending().forEach {

            if(answer > it) {
                answer -= it
                count++
            } else {
                return if(answer > 0) {
                    count + 1
                } else {
                    count
                }
            }

        }

        return 0
    }

    fun test(tangerine: IntArray, filter : Int) : Int {

        var count = 0

        tangerine.forEach {
            if(it == filter) count++
        }

        return count
    }
}

 

 

 

++) 2초 이상 걸리는 로직이 있다? 이거 백준이었으면 백퍼 빠따각이다; 하면서 다른 사람의 풀이를 찾아봤다.

groupby 라는 매서드가 있던데, 원하는 조건으로 묶어준다.

예를 들어서, {1, 3, 2, 5, 4, 5, 2, 3}이라는 숫자 자료형 배열이 있다 가정한다. 

tangerine.groupBy { it }.toList()

라고 입력하면

[(1, [1]), (3, [3, 3]), (2, [2, 2]), (5, [5, 5]), (4, [4])]

it, 즉 tangerine이라는 배열을 돌면서 같은 조건(it이라고 입력했으니 배열의 요소가 같은)에 해당하는 값으로 묶인다.

이를 뒤에 묶인 숫자의 갯수만큼 descending(자바는 모르겠는데 코틀린은 descending의 조건을 걸 수 있나보다! 하나 배워감)해서 정렬한 후에 두 번째 요소의 크기 만큼 k를 넣는 방법이 있다.

    println(tangerine.groupBy { it }.toList().sortedByDescending { it.second.size })

 

 

 

 

반응형