문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/172927

제한 사항

입출력 예

풀이
import java.util.ArrayList;
import java.util.HashMap;
import java.util.stream.Collectors;
class Solution {
int answer = 0;
public int solution(int[] picks, String[] minerals) {
final int picksLen = (picks[0] + picks[1] + picks[2]) * 5;
int minLen = (minerals.length > picksLen) ? picksLen : minerals.length;
ArrayList<ArrayList<String>> mineralLists = new ArrayList<>();
HashMap<ArrayList<String>, Integer> stonePickMap = new HashMap<>();
HashMap<String, int[]> mineralMap = new HashMap<>() {{
put("diamond", new int[] { 1, 5, 25 });
put("iron", new int[] { 1, 1, 5 });
put("stone", new int[] { 1, 1, 1 });
}};
for (int i = 0; i < minLen; i += 5) { // minerals를 광석 리스트로 변환
mineralLists.add(new ArrayList<>());
for (int j = i; j < ((i + 4 < minLen) ? i + 5 : minLen); j++)
mineralLists.get(mineralLists.size() - 1).add(minerals[j]);
}
for (ArrayList<String> mineralList : mineralLists) { // 돌 곡괭이 기준 피로도 합 계산 후 값 넣어줌
int sum = 0;
for (String mineral : mineralList) sum += mineralMap.get(mineral)[2];
stonePickMap.put(mineralList, sum);
}
// 돌 곡괭이 기준 피로도 높은 순으로 정렬
ArrayList<ArrayList<String>> sortedMineralLists = new ArrayList(mineralLists.stream()
.sorted((l1, l2) -> stonePickMap.get(l2) - stonePickMap.get(l1)).collect(Collectors.toList()));
for (int i = 0; i < mineralLists.size(); i++) {
if (picks[0] > 0) { // 다이아몬드 곡괭이 사용 시
sortedMineralLists.get(i).forEach(m -> answer += mineralMap.get(m)[0]);
picks[0]--;
}
else if (picks[1] > 0) { // 철 곡괭이 사용 시
sortedMineralLists.get(i).forEach(m -> answer += mineralMap.get(m)[1]);
picks[1]--;
}
else { // 돌 곡괭이 사용 시
sortedMineralLists.get(i).forEach(m -> answer += mineralMap.get(m)[2]);
picks[2]--;
}
}
return answer;
}
}
후기
처음에 생각의 시작을 잘 해야하는 문제이다. 나도 처음에 단순히 앞에서부터 입력받은대로 처리했다가 틀렸다. 이 문제의 관건은 가장 피로도가 높은 방법 순으로 정렬을 하고 곡괭이는 가장 피로도가 낮은 것을 사용한다는 점이다. 이렇게 하면 각각의 광물 순서는 바꿀 수 없지만 5개씩 묶어서 처리하는 것은 순서가 상관없기 때문에 피로도가 높은 것을 확실하게 하기 위해 내림차순으로 정렬을 한 것이다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
| [프로그래머스][JAVA][Lv. 1] 콜라츠 추측 (0) | 2023.08.01 |
|---|---|
| [프로그래머스][JAVA][Lv. 1] 평균 구하기 (0) | 2023.08.01 |
| [프로그래머스][JAVA][Lv. 1] 하샤드 수 (0) | 2023.07.30 |
| [프로그래머스][JAVA][Lv.1] 핸드폰 번호 가리기 (0) | 2023.07.30 |
| [프로그래머스][JAVA][Lv. 2] JadenCase 문자열 만들기 (0) | 2023.07.26 |