Coding Test

[Kotlin] 99 클럽 코딩 테스트 스터디 미들러 39일차 - 광물 캐기 [재풀이 필요]

SeungYong.Lee 2024. 8. 30. 10:00
반응형

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

 

프로그래머스

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

programmers.co.kr

[문제]

마인은 곡괭이로 광산에서 광석을 캐려고 합니다. 마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 각각 0개에서 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도가 소모됩니다. 각 곡괭이로 광물을 캘 때의 피로도는 아래 표와 같습니다.

예를 들어, 철 곡괭이는 다이아몬드를 캘 때 피로도 5가 소모되며, 철과 돌을 캘 때는 피로도가 1씩 소모됩니다. 각 곡괭이는 종류에 상관없이 광물 5개를 캔 후에는 더 이상 사용할 수 없습니다.

마인은 다음과 같은 규칙을 지키면서 최소한의 피로도로 광물을 캐려고 합니다.

  • 사용할 수 있는 곡괭이중 아무거나 하나를 선택해 광물을 캡니다.
  • 한 번 사용하기 시작한 곡괭이는 사용할 수 없을 때까지 사용합니다.
  • 광물은 주어진 순서대로만 캘 수 있습니다.
  • 광산에 있는 모든 광물을 캐거나, 더 사용할 곡괭이가 없을 때까지 광물을 캡니다.

즉, 곡괭이를 하나 선택해서 광물 5개를 연속으로 캐고, 다음 곡괭이를 선택해서 광물 5개를 연속으로 캐는 과정을 반복하며, 더 사용할 곡괭이가 없거나 광산에 있는 모든 광물을 캘 때까지 과정을 반복하면 됩니다.

마인이 갖고 있는 곡괭이의 개수를 나타내는 정수 배열 picks 광물들의 순서를 나타내는 문자열 배열 minerals 매개변수로 주어질 , 마인이 작업을 끝내기까지 필요한 최소한의 피로도를 return 하는 solution 함수를 완성해주세요.

 

[제한 사항]

 

[입출력 예]

 

[풀이]

주어진 곡괭이를 통해 최소한의 피로도를 고려하여 작업을 진행하도록 해야 합니다.

곡괭이 하나당 광물 캐기가 가능한 Count가 5개입니다.

따라서 광물을 5개씩 묶어 처리합니다.

run {
    var i = 0
    while (i < minerals.size) {
        if (i / 5 == cnt) {
            break
        }
        for (j in i until i + 5) {
            val m = minerals[j]
            when (m) {
                "diamond" -> {
                    dp += 1
                    ip += 5
                    sp += 25
                }
                "iron" -> {
                    dp += 1
                    ip += 1
                    sp += 5
                }
                else -> {
                    dp += 1
                    ip += 1
                    sp += 1
                }
            }
            if (j == minerals.size - 1) {
                break
            }
        }
        section[i / 5][0] = dp
        section[i / 5][1] = ip
        section[i / 5][2] = sp

        sp = 0
        ip = sp
        dp = ip
        i += 5
    }
}

 

  • when 문: 현재 광물에 따라 각 곡괭이로 캤을 때의 피로도를 누적합니다.
    • 다이아몬드: dp는 1, ip는 5, sp는 25를 증가시킵니다.
    • 철: dp, ip, sp 모두 1씩 증가시키며, sp는 5를 증가시킵니다.
    • 돌: 모두 1씩 증가시킵니다.
  • 섹션별 피로도 저장: 계산된 피로도를 section 배열에 저장합니다.

 

다음으로, 돌 곡괭이로 캤을 때 피로도가 높은 섹션부터 우선순위를 두도록 내림차순으로 정렬합니다.

피로도가 높은 섹션부터 먼저 채굴해야 최적의 결과를 얻을 수 있습니다.

Arrays.sort(section) { o1: IntArray, o2: IntArray -> (o2[2] - o1[2]) }

 

 

그리고 이제 다이아 - 철 - 돌 순서대로 사용 처리를 해줍니다.

for (i in 0 until cnt) {
    if (picks[0] != 0) {
        answer += section[i][0] // 다이아로 캤을 때 피로도
        picks[0]--
    } else if (picks[1] != 0) {
        answer += section[i][1] // 철로 캤을 때 피로도
        picks[1]--
    } else if (picks[2] != 0) {
        answer += section[i][2] // 돌로 캤을 때 피로도
        picks[2]--
    }
}

 


어떻게 풀어야 할지는 알겠으나.. 풀이 구성에 계속 실패하여 다른 분들의 답안을 참고했습니다.

다시 한번 풀어보는 것으로 해야겠네요.
풀이 방식이 여러 가지가 있겠지만 너무 복잡하지 않은 방법을 찾아야겠습니다.

 

반응형