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

JIWOO YUN·2023년 5월 11일
0

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/172927

구현방법

마인이 가지고 있는 곡갱이

돌 , 철 , 다이아

-> 더이상 사용할 곡갱이가 없거나 광물 다캐면 끝

picks에 현재 가지고있는 곡갱이 수

-> 다이아 개수 , 철 개수 , 돌 갯수

다이아곡갱이 : 무조건 피로도 1

철 곡갱이 : 다이아 5, 철,돌 : 1

돌곡갱이 : 25 5 1

무조건 5개의 광물을 연속으로 캔다.

-> 5개가 한묶음

5개씩 묶었을때 가장 피로도가 큰놈 -> 다이아 곡갱이로 캔다

가중치

다이아 25

철 5

돌 1

각 그룹별 계산하고 내림차순 정렬

-> 다이아 곡갱이부터 사용시작 -> 5묶음 계산 끝나면 정답에 더해주기

돌맹이를 5개씩 나눈다.

LIST< Group > 을 만든다.

Group이있어야하겠네요

-> Group 클래스

: 가중치

LIST에 현재 돌맹이 넣어두기


처음에 간과했던점 : 곡갱이의 개수가 한정되있기 때문에 뒷부분을 아예 못들어가는 것을 처음에 간과했다가 곡갱의 전체 개수를 체크해서 뒷부분을 체크하지 않고 진행하니까 테스트케이스를 전부 통과했습니다.


구현알고리즘

Greedy

CODE

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


class Solution {
    public int solution(int[] picks, String[] minerals) {
        int answer = 0;

        //그룹 리스트 정리용
        List<Group> GroupList = new ArrayList<>();

        int dia = picks[0];
        int iron = picks[1];
        int rock = picks[2];

        int all_pick = dia + iron + rock;

        //미네랄 그룹 나누기
        for (int idx = 0; idx < minerals.length; idx += 5) {
            if(GroupList.size() >=all_pick)
                break;
            Group group = new Group();
            group.Lists = new ArrayList<>();
            for (int check = idx; check < idx + 5; check++) {
                if(minerals.length <= check)
                    break;
                switch (minerals[check]) {
                    case "diamond":
                        group.sum += 25;
                        group.Lists.add(minerals[check]);
                        break;
                    case "iron":
                        group.sum += 5;
                        group.Lists.add(minerals[check]);
                        break;
                    default:
                        group.sum += 1;
                        group.Lists.add(minerals[check]);
                }
            }
            GroupList.add(group);
        }

        //내림차순 정리
        Collections.sort(GroupList, (o1, o2) -> o2.sum - o1.sum);

        for (int idx = 0; idx < GroupList.size(); idx++) {
            //다이아곡갱이는 어쩌피 전부 1임
            if (dia != 0) {
                dia -= 1;
                answer += GroupList.get(idx).Lists.size();
                //철곡갱이는 다이아만 5 그외 전부 1
            } else if (iron != 0) {
                iron -= 1;
                for (int checking = 0; checking < GroupList.get(idx).Lists.size(); checking++) {
                    if (GroupList.get(idx).Lists.get(checking).equals("diamond")) {
                        answer += 5;
                    } else {
                        answer += 1;
                    }
                }
                //돌곡은 다이아 25 철 5 돌 1
            } else if (rock != 0) {
                rock -= 1;
                for (int checking = 0; checking < GroupList.get(idx).Lists.size(); checking++) {
                    if (GroupList.get(idx).Lists.get(checking).equals("diamond")) {
                        answer += 25;
                    } else if (GroupList.get(idx).Lists.get(checking).equals("iron")) {
                        answer += 5;
                    } else {
                        answer += 1;
                    }
                }

                //곡갱이 다쓰면 끝
            } else
                break;
        }

        System.out.println(answer);
        return answer;
    }

    class Group {
        int sum;
        List<String> Lists;
    }
}
profile
Backend Developer 지원 / 도전

0개의 댓글