[Programmers] 광물 캐기(LV.2)

Alice·2023년 5월 13일
0

풀이 소요시간 : 60분(ㅠㅠㅠ)

나름 쉬운 그리디 문제인게 눈에 보여서 20분만에 다 풀고 제출했는데 딱 한가지 케이스에서 통과가 안됬다. 그리고 그 한가지를 찾아서 고치는데 40분이 걸렸는데, 내가 곡괭이가 부족한 경우 반복문을 빠져나오는 것은 설계를 했으나, 망할 sort 에서 곡괭이가 부족한 경우를 생각 못하고 정렬을 해버린 것이다.


아니 당연히 곡괭이가 부족한 경우 끝까지 전진을 못하는데 뭔 생각으로 끝까지 정렬을 한거냐??

int Dia_Pick = picks[0];
    int Iron_Pick = picks[1];
    int Stone_Pick = picks[2];
    int Total_Pick = Dia_Pick + Iron_Pick + Stone_Pick;

    
    if(Total_Pick >= Vector.size()) sort(Vector.begin(), Vector.end(), Cmp);
    else sort(Vector.begin(), Vector.begin() + Total_Pick, Cmp);

그니까 이렇게 총 곡괭이 수를 분간해서 정렬 해야된다는거다..


전체 코드

#include <string>
#include <algorithm>
#include <vector>

using namespace std;

struct Block{
    int Dia_Cnt;
    int Iron_Cnt;
    int Stone_Cnt;
};
vector<Block> Vector;


//높은 순 정렬(내림차순)
bool Cmp(Block A, Block B) {
    if(A.Dia_Cnt == B.Dia_Cnt) {
        if(A.Iron_Cnt == B.Iron_Cnt) {
            return A.Stone_Cnt > B.Stone_Cnt;
        }
        return A.Iron_Cnt > B.Iron_Cnt;
    }
    return A.Dia_Cnt > B.Dia_Cnt;
}



int solution(vector<int> picks, vector<string> minerals) {
    
    int Element = 0;
    int Dia_Cnt = 0;
    int Iron_Cnt = 0;
    int Stone_Cnt = 0;

    for(int i = 0; i < minerals.size(); i++) {
        
        if(minerals[i] == "diamond") Dia_Cnt++;
        else if(minerals[i] == "iron") Iron_Cnt++;
        else if(minerals[i] == "stone") Stone_Cnt++;
        
        Element++;
        
        if(Element == 5 || i == minerals.size() - 1) {
            Vector.push_back({Dia_Cnt, Iron_Cnt, Stone_Cnt});
            Dia_Cnt = 0;
            Iron_Cnt = 0;
            Stone_Cnt = 0;
            Element = 0;
        }
        
    } 
    
    
    
    int answer = 0;
    int Dia_Pick = picks[0];
    int Iron_Pick = picks[1];
    int Stone_Pick = picks[2];
    int Total_Pick = Dia_Pick + Iron_Pick + Stone_Pick;

    
    if(Total_Pick >= Vector.size()) sort(Vector.begin(), Vector.end(), Cmp);
    else sort(Vector.begin(), Vector.begin() + Total_Pick, Cmp);
    
    
    
    for(int i = 0; i < Vector.size(); i++) {    
        
        int Dia_Cnt = Vector[i].Dia_Cnt;
        int Iron_Cnt = Vector[i].Iron_Cnt;
        int Stone_Cnt = Vector[i].Stone_Cnt;
        
        if(Dia_Pick > 0) {
            answer += (Dia_Cnt * 1);
            answer += (Iron_Cnt * 1);
            answer += (Stone_Cnt * 1);
            Dia_Pick--;
            continue;
        } 
        else if(Iron_Pick > 0) {
            answer += (Dia_Cnt * 5);
            answer += (Iron_Cnt * 1);
            answer += (Stone_Cnt * 1);
            Iron_Pick--;
            continue;
        } 
        else if(Stone_Pick > 0) {
            answer += (Dia_Cnt * 25);
            answer += (Iron_Cnt * 5);
            answer += (Stone_Cnt * 1);
            Stone_Pick--;
            continue;
        }

        
        //여기까지 넘어오면 곡괭이가 모두 소진된 상황이다.
        break;
        
    }
    
    return answer;
}
profile
거창하지 않아도, 늘 꾸준히 기록하는 습관

0개의 댓글