[프로그래머스]광물캐기

allnight5·2023년 6월 22일
0

프로그래머스

목록 보기
69/73

링크

간단한것 같았으나.. 고민하느라 2시간이나 걸렸다.

/*
minerals에
diamond가 많은 지점과 iron이 많은지점을 찾기위해
앞에서부터 5개씩 해서 체크한다.
다이아몬드와 철 돌을 돌로 깰수있는 
피로도로 바꿔서 저장한다.
25보다 크다면 다이아몬드가 있다.(26부터)
5보다 크다면 철이있다.(돌이 5개면 5니까)
*/
 


import java.util.Arrays;
class Solution { 
    public int solution(int[] picks, String[] minerals) {
        int answer = 0; 
        int mineralsLength = minerals.length;
        //미네랄을 숫자로 변환해서 저장
        int[] mineralsInteger = new int[(mineralsLength/5+1)];
        transMineral(minerals, mineralsInteger, mineralsLength); 
        //정렬
        Arrays.sort(mineralsInteger);
        
        int startPoint = mineralsLength/5;
        
        //거꾸로 출력하며 가지고 있는 곡괭이로 체크하며 해제 
        for(; startPoint>=0; startPoint--){
            for(int i=0; i<3;i++){
                if(picks[i] != 0){
                    picks[i] -= 1; 
                    answer += transReturnInt(i, mineralsInteger[startPoint]);
                    break;
                }
                //돌까지 가지고 있는 것이 없다면 종료한다.
                if(i == 2){
                    return answer;
                }
            }
        } 
        return answer;
    } 
    
    public void transMineral(String[] minerals,int[] mineralsInteger,  int endPoint){ 
        for(int i= 0; i<endPoint; i++){ 
            if(minerals[i].equals("diamond")){
                mineralsInteger[i/5]+= 25;
            }else if(minerals[i].equals("iron")){
                mineralsInteger[i/5]+=5;
            }else {
                mineralsInteger[i/5]+=1;
            } 
        } 
    }  
    
    public int transReturnInt(int pickax, int mineral){
        if(pickax == 0){
            return 5;
        }else if(pickax == 1){ 
            return mineral/5+mineral%5;
        }else{
            return mineral;
        }
    }
}

막상 하고 나니까 두가지나 빼먹었다..
첫번째 순서대로 되야한다.
나는 광물들의 순서따윈 신경쓰지 않고 큰값들을 정렬하여 계산했다.곡괭이는 3개인데 4번째 집합것을 캐면 안되니 집합별로 위치가 필요하다.
두번째 곡괭이마다 광물에 따른 피로도가 다르다는 것이다.
그리고 갯후로 반환해 줘야하는데.. 다이아몬드일때 2개일수도 있는데 5개로 반환해 줬다. 여기서 깨달은 것이다..
다이아몬드, 철, 돌의 갯수가 필요하다..

import java.util.*;
class Solution { 
    List<int[]> list = new ArrayList<>();  
    public int solution(int[] picks, String[] minerals) {
        int answer = 0; 
        int mineralsLength = minerals.length;  
        int maxPicks = picks[0]+picks[1]+picks[2];
        
        for(int i=0;i<mineralsLength; i+= 5){
            listInMineral(i, minerals, mineralsLength);
        } 
        
        Collections.sort(list, (a, b) ->
                   b[0]-a[0]
                   );
        
        for(int[] data : list){
            if(data[1] >= maxPicks){
                continue;
            } 
            int sum = transReturnInt(picks, data);
            if(sum == 0) return answer; 
            answer += sum; 
        } 
        
        return answer;
    } 
    
    public void listInMineral(int cur, String[] minerals, int endPoint){
        int sum =0; 
        int dia = 0;
        int iron =0;
        int stone =0;
        for(int i=cur; i<cur+5;i++){
            if(i < endPoint){
                if(minerals[i].equals("diamond")){
                    sum += 25;
                    dia++;
                }else if(minerals[i].equals("iron")){
                    sum += 5;
                    iron++;
                }else{
                    sum++;
                    stone++;
                }
            }
        }
        list.add(new int[]{sum, cur/5, dia, iron, stone});
    }
    
    
    public int transReturnInt(int[] picks, int[] data){ 
        if(picks[0]>0){
            picks[0]-=1;
            return data[2]+data[3]+data[4];
        }else if(picks[1]>0){ 
            picks[1]-=1;
            return data[2]*5+data[3]+data[4];
        }else if(picks[2]>0){
            picks[2]-=1;
            return data[0];
        }else{
            return 0;
        }
    }
    
}
profile
공부기록하기

0개의 댓글