코딩테스트/프로그래머스
[Java] 프로그래머스 level 2 - 광물캐기
곰돌이볼
2023. 3. 29. 09:19
- 문제
- 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/172927
- 광물을 캘 때 발생하는 피도로 중 최소값 구하기
- 로직 1)
- minerals 광물들을 5개 단위로 캐짐 → 5개 단위로 각 곡괭이로 광물을 캤을 피로도를 배열로 저장
- 다이아 곡괭이부터 사용해서 광물 캐기 → 이때 캐는 광물은 iron에서 가장 피로도가 높은 광물 캐기
- 철 곡괭이 사용해서 광물 캐기 → 이때 캐는 광물은 stone에서 가장 피로도가 높은 광물 캐기
- 돌 곡괭이 사용해서 광물 캐기 → 이때 캐는 광물은 stone에서 가장 피로도가 낮은 광물 캐기
class Solution {
public int solution(int[] picks, String[] minerals) {
int answer = 0;
int len = minerals.length;
int all_picks = picks[0] + picks[1] + picks[2];
if(len > all_picks*5) len = all_picks * 5;
else all_picks = len%5 == 0 ? len/5 : len/5+1;
int[] diamond = new int[all_picks];
int[] iron = new int[all_picks];
int[] stone = new int[all_picks];
boolean[] visited = new boolean[all_picks];
int k = -1;
for(int i=0; i<len; i++) {
if(i%5 == 0) k++;
if(minerals[i].equals("diamond")) {
diamond[k] += 1;
iron[k] += 5;
stone[k] += 25;
} else if(minerals[i].equals("iron")) {
diamond[k] += 1;
iron[k] += 1;
stone[k] += 5;
} else {
diamond[k] += 1;
iron[k] += 1;
stone[k] += 1;
}
}
k = 0;
while(true) {
while(picks[k] != 0) {
int index = 0;
if(k == 0) {
index = max_index(visited, iron);
answer += diamond[index];
}
else if(k == 1) {
index = max_index(visited, stone);
answer += iron[index];
}
else if(k == 2) {
index = min_index(visited, stone);
answer += stone[index];
}
visited[index] = true;
picks[k]--;
if(visit(visited)) break;
}
if(!visit(visited)) k++;
else break;
}
return answer;
}
public int max_index(boolean[] visited, int[] picks_prio) {
int max = -1;
int index = 0;
for(int i=0; i<picks_prio.length; i++) {
if(!visited[i] && (max < picks_prio[i])) {
index = i;
max = picks_prio[i];
}
}
return index;
}
public int min_index(boolean[] visited, int[] picks_prio) {
int min = 100;
int index = 0;
for(int i=0; i<picks_prio.length; i++) {
if(!visited[i]) {
index = i;
if(min > picks_prio[i]) {
index = i;
min = picks_prio[i];
}
}
}
return index;
}
public boolean visit(boolean[] visited) {
for(int i=0; i<visited.length; i++) {
if(!visited[i]) return false;
}
return true;
}
}
- 결과
- 성공