본문 바로가기
Computer/Algorithm_Java

[Algorithm_Java] 광물 캐기 (Success)

by HJ0216 2023. 10. 14.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

Language: Java

 

🚨 곡갱이 순서 부여 로직 생성 실패

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.Arrays;
 
class Solution {
    static int[] mineralsToInt;
    static int[] sumWeight;
    public int solution(int[] picks, String[] minerals) {
        // minerals: 5
        // diamond count sort
        // picks 0 1 2
        int answer = 0;
        
        calcWeightMinerals(minerals);
        calcSumWeight(mineralsToInt);
        createOrderPickUse(picks);
        Arrays.sort(sumWeight);
                
        return answer;
    }
    public static int[] calcWeightMinerals(String[] minerals){
        mineralsToInt = new int[minerals.length];
        for(int i=0; i<minerals.length; i++){
            switch(minerals[i]){
                case "diamond": mineralsToInt[i]=3break;
                case "iron": mineralsToInt[i]=2break;
                case "stone": mineralsToInt[i]=1break
            }
        }
        return mineralsToInt;
    }
    public static int[] calcSumWeight(int[] mineralsToInt){
        sumWeight = new int[(mineralsToInt.length/5)+1];
        int sumSubWeight = 0;
        int idx=0;
        for(int i=0; i<mineralsToInt.length; i++){
            sumSubWeight += mineralsToInt[i];
            if(i%5==4 || i==(mineralsToInt.length-1)){
                sumWeight[idx++= sumSubWeight;
                sumSubWeight = 0;
            }
        }
        return sumWeight;
    }
}
 
 

 

😮 찾아본 풀이

⭐이중 배열과 포인터 활용

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.*;
 
class Solution {
    public int solution(int[] picks, String[] minerals) {
        int answer = 0;
        int countPicks = picks[0+ picks[1+ picks[2];
        int[][] mineralFatigueTable = new int[minerals.length / 5 + 1][3];
        
        for(int i = 0; i < minerals.length && countPicks > 0; i++) {
            switch(minerals[i])
            {
                case "diamond":
                    mineralFatigueTable[i / 5][0+= 1;
                    mineralFatigueTable[i / 5][1+= 5;
                    mineralFatigueTable[i / 5][2+= 25;
                    break;
                case "iron":
                    mineralFatigueTable[i / 5][0+= 1;
                    mineralFatigueTable[i / 5][1+= 1;
                    mineralFatigueTable[i / 5][2+= 5;
                    break;
                case "stone":
                    mineralFatigueTable[i / 5][0+= 1;
                    mineralFatigueTable[i / 5][1+= 1;
                    mineralFatigueTable[i / 5][2+= 1;
            }
            
            if(i % 5 == 4) countPicks--;            
            
        }
        
        Arrays.sort(mineralFatigueTable, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[2< o2[2]) 
                    return 1;
                else 
                    return -1;
            }
        });
        
        for(int i = 0, pickIndx = 0; i < mineralFatigueTable.length; i++) {
            while(pickIndx < 3 && picks[pickIndx] == 0) pickIndx++;
            if(pickIndx == 3break;
            picks[pickIndx]--;
            answer += mineralFatigueTable[i][pickIndx];
        }
        
        return answer;
    }
}
 
 

 

1. mineralFatigueTable

    - [광물을 5개씩 묶었을 때 몇 번째 묶음인지,곡괭이 별 피로도]

2. Arrays.sort(mineralFatigueTable)

    - compare

        - 피로도 계산이 가장 큰 돌을 사용했을 때 기준으로 5개 광물 캐기 피로도 묶음을 내림차순 정렬

    - pickIdx로 mineralFatigueTable에서 피로도 선택

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스 광물 캐기 java

문제링크문제 조건을 읽어보면, 어차피 곡괭이 하나 들었으면 마인크래프트마냥 앞에꺼 다섯개 무조건 캐야한다.1-1 마인크래프트랑은 다르게 앞에 놓여진 블록들을 알때, 어떻게 캐야 제일 효

velog.io