[Kotlin/프로그래머스] 코딩테스트 연습 > 연습문제 > 광물 캐기

👀 문제

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

👊 도전

1. 설계

  1. 문제 설명대로 구현

2. 구현

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class Solution {
fun solution(t: String, p: String): Int {
var answer: Int = 0

    /**
     * minerals를 5개씩 잘라서 저장
     * 배열별 D I S 갯수 별 내림차순 정렬
     * D I S 순으로 picks 차감하면서 계산
     */

    // 곡괭이 개수만큼 리스트로 변환
    var pickList = arrayOf<String>()
    picks.forEachIndexed { index, pick ->
        val name = when (index) {
            0 -> "diamond"
            1 -> "iron"
            else -> "stone"
        }
        repeat(pick) {
            pickList += name
        }
    }

    // 광물을 5개씩 자르고 각 개수를 저장
    var countArray: Array<IntArray> = arrayOf()
    var count = intArrayOf(0, 0, 0)
    minerals.forEachIndexed { index, mineral ->
        if (index % 5 == 0) {
            count = intArrayOf(0, 0, 0)
        }
        when (mineral) {
            "diamond" -> count[0]++
            "iron" -> count[1]++
            "stone" -> count[2]++
        }
        if (index % 5 == 4 || index == minerals.lastIndex) {
            countArray += count
        }
    }
    // 곡괭이 개수만큼만 쓸 수 있으므로 뒤에 광물은 자른다
    if (pickList.size < countArray.size) {
        countArray = countArray.slice(IntRange(0, pickList.size - 1)).toTypedArray()
    }

    // 다이아몬드, 철, 돌 개수 내림차순 정렬
    val sortedList = countArray.sortedWith(compareBy({ -it[0] }, { -it[1] }, { -it[2] }))

    // 계산
    var pickIndex = 0
    run loop@{
        sortedList.forEach { mineral ->
            val name = pickList.getOrNull(pickIndex) ?: return@loop
            val diamond = when (name) {
                "diamond" -> 1
                "iron" -> 5
                else -> 25
            }
            val iron = when (name) {
                "diamond" -> 1
                "iron" -> 1
                else -> 5
            }
            val stone = 1
            val temp = mineral[0] * diamond + mineral[1] * iron + mineral[2] * stone
            answer += temp
            pickIndex++
        }
    }
    return answer
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. picks의 곡괭이 각 개수만큼 곡괭이 리스트를 만든다

  2. minerals를 5개씩 자르고 각 개수를 카운트해서 저장한다
    • Array 0, 1, 2번째에 다이아몬드, 철, 돌 개수를 저장한다.
  3. 5개로 자른 countArray가 곡괭이 수보다 많으면 그만큼 자른다
    • 소팅하기 전에 잘라야한다.
    • 곡괭이가 부족하므로 뒤에는 어짜피 할 수 없다.
  4. 다이아몬드, 철, 돌이 많은 순으로 내림차순 정렬한다
    • 다이아몬드가 많은 것 부터 다이아몬드 곡괭이로 자르는 것이 이득이기 때문이다.
  5. 다이아몬드, 철, 돌이 많은 순으로 내림차순 정렬한다
    • 다이아몬드가 많은 것 부터 다이아몬드 곡괭이로 자르는 것이 이득이기 때문이다.
  6. pickList를 뽑으면서 정렬된 countArray를 계산한다

👏 해결 완료!