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]--
}
}
어떻게 풀어야 할지는 알겠으나.. 풀이 구성에 계속 실패하여 다른 분들의 답안을 참고했습니다.
다시 한번 풀어보는 것으로 해야겠네요.
풀이 방식이 여러 가지가 있겠지만 너무 복잡하지 않은 방법을 찾아야겠습니다.