[프로그래머스] 광물 캐기 (Java)
https://school.programmers.co.kr/learn/courses/30/lessons/172927
입력 : 송전탑의 개수 n, 전선 정보가 담긴 정수 2차원 배열 wires
출력 : 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)
O(n^2)
그리디
구현
import java.util.*;
class Solution {
public int solution(int[] picks, String[] minerals) {
int answer = 0;
int totalPicks = picks[0] + picks[1] + picks[2]; // 전체 곡괭이 개수
int size = Math.min((minerals.length + 4) / 5, totalPicks); // 광물의 그룹 수 (5개씩 자르기 때문에 길이를 5로 나눈 값)
// 그룹화하여 피로도를 저장하는 배열
int[][] fatigue = new int[size][3];
// 광물을 5개씩 그룹화
for (int i = 0; i < size * 5 && i < minerals.length; i++) {
int group = i / 5; // 현재 그룹
String mineral = minerals[i];
// 다이아 곡괭이 피로도
if (mineral.equals("diamond")) {
fatigue[group][0] += 1; // 다이아몬드 곡괭이는 다이아몬드를 캐는 데 피로도가 1
fatigue[group][1] += 5; // 철 곡괭이는 다이아몬드를 캐는 데 피로도가 5
fatigue[group][2] += 25; // 돌 곡괭이는 다이아몬드를 캐는 데 피로도가 25
} else if (mineral.equals("iron")) {
fatigue[group][0] += 1; // 다이아몬드 곡괭이는 철을 캐는 데 피로도가 1
fatigue[group][1] += 1; // 철 곡괭이는 철을 캐는 데 피로도가 1
fatigue[group][2] += 5; // 돌 곡괭이는 철을 캐는 데 피로도가 5
} else if (mineral.equals("stone")) {
fatigue[group][0] += 1; // 다이아몬드 곡괭이는 돌을 캐는 데 피로도가 1
fatigue[group][1] += 1; // 철 곡괭이는 돌을 캐는 데 피로도가 1
fatigue[group][2] += 1; // 돌 곡괭이는 돌을 캐는 데 피로도가 1
}
}
// 피로도를 기준으로 내림차순 정렬
Arrays.sort(fatigue, (a, b) -> b[2] - a[2]);
// 최소 피로도 계산
for (int i = 0; i < size; i++) {
if (picks[0] > 0) { // 다이아몬드 곡괭이가 남아있을 경우
answer += fatigue[i][0];
picks[0]--;
} else if (picks[1] > 0) { // 철 곡괭이가 남아있을 경우
answer += fatigue[i][1];
picks[1]--;
} else if (picks[2] > 0) { // 돌 곡괭이가 남아있을 경우
answer += fatigue[i][2];
picks[2]--;
}
}
return answer;
}
}