프로그래머스 Level 2 광물 캐기

2023. 4. 3. 21:05알고리즘/문제

광물 캐기

출처: 프로그래머스

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

 

프로그래머스

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

programmers.co.kr

 

풀이

1. 저는 minerals 배열을 5개씩 묶어서 보았습니다.

minerals의 size가 5의 배수다? -> 5개씩 묶은 배열들을 배열에 저장
나머지가 있다? -> 곡괭이의 전체 개수X5 한 값까지만 minerals 배열을 자르고 5개씩 묶어서 저장

다시 말해 곡괭이 1개당 5개의 미네랄을 캘 수 있으니까 곡괭이 전체 개수*5 가 최대로 캘 수 있는 미네랄들의 수입니다.
그래서 미네랄들의 배열이 곡괭이가 캘 수 있는 수를 넘어가면 넘어가는 미네랄은 버리자!
그래서 slice하고 chunked(5)로 묶었습니다.

2. 이제 각 묶음이 가진 다이아몬드 , 철, 돌의 개수를 정리해 배열에 담아 배열 안에 넣어줬습니다.

"diamond", "diamond", "diamond", "iron", "iron" 배열은
intArrayOf(3,2,0) 이렇게 바꾸었습니다.

3. 이제 각 각의 카운트를 담은 배열을 배열에 넣어서 다이아몬드 , 철 , 돌 순으로 정렬 했습니다.

만약 다이아몬드 개수가 같으면 철이 많은거로 정렬하고 이렇게 했습니다.
저는 코틀린이라 sortedWith로 comparedBy로 정렬 하였습니다.

왜 정렬을 하지??
다이아몬드가 많은 배열부터 다이아몬드 곡괭이로 판다고 생각했습니다.

만약, 앞에서 다이아몬드가 적은 곡괭이를 사용한다면 피로도는 절대 최솟값이 될 수 없습니다.

4. 마지막으로 5개씩 묶인 정렬된 배열을 반복문을 통해 하나씩 확인합니다.

내가 다이아몬드 곡괭이가 있으면 다이아몬드 곡괭이로 지금 확인하는 묶음을 해결하고 answer 갱신
다이아몬드는 없고 철 곡괭이가 있으면 철 곡괭이로 계산해서 answer 갱신하고
그것도 없으면 돌 곡괭이로 다이아몬드 개수 answer += 25 + 철5 + 돌*1 갱신하면 됩니다.

생각나는데로 적고 문제는 해결했지만 다른 방법을 더 생각해봐야겠습니다.

 

코드

class Solution {
    fun solution(picks: IntArray, minerals: Array<String>): Int {
        var answer: Int = 0
        val x = if (minerals.size > picks.sum() * 5) minerals.slice(0 until picks.sum() * 5).toList()
            .chunked(5) else minerals.toList().chunked(5)
        val arr = Array<IntArray>(x.size) { IntArray(3) }
        x.forEachIndexed { index, strings ->
            var d = 0
            var i = 0
            var s = 0
            strings.forEach { v ->
                when (v) {
                    "diamond" -> d++
                    "iron" -> i++
                    else -> s++
                }
            }
            arr[index][0] = d
            arr[index][1] = i
            arr[index][2] = s
        }
        val s = arr.toList().sortedWith(compareBy({ -it[0] }, { -it[1] }, { -it[2] }))
        s.forEach {
            if (picks[0] != 0) {
                answer += it[0] + it[1] + it[2]
                picks[0] -= 1
            } else if (picks[1] != 0) {
                answer += it[0] * 5 + it[1] + it[2]
                picks[1] -= 1
            } else {
                answer += it[0] * 25 + it[1] * 5 + it[2]
                picks[2] -= 1
            }
        }
        return answer
    }
}