Lv 0. 진료순서 정하기 - sort는 algorithm 헤더에, greater<>()는 내림차순. *다시 풀어보기*

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

 

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

using namespace std;

vector<int> solution(vector<int> emergency) {
    vector<int> answer;
    vector<int> duple(emergency.begin(),emergency.end());
    sort(duple.begin(),duple.end(),greater<int>());
    for(int i=0; i<emergency.size(); i++){
        for(int j=0; j<emergency.size(); j++){
            if(emergency[i]==duple[j]) answer.emplace_back(j+1);
        }
    }
    return answer;
}

 

일단 처음에는 #include <bits/stdc++.h> 로 작성해서 제출하였고, sort의 경우 alogorithm 헤더에 있을것 같아서 그렇게 제출하니 맞았다. sort는 algorithm 헤더에 있다는걸 기억하도록 하자.

 

sort(duple.begin(),duple.end(),less<int>()); 로 먼저 했었는데, 이렇게 하니까 예를들어 1 2 3 4 5 ... 형태로 오름차순 값으로 나왔다

내림차순 형태로 정렬하고 싶으면 greater를 써서 큰 값들이 먼저 나오도록 해야한다. 이 경우 암기하는데 있어서는 약간 직관적이게 이해가 가지 않는 편이라 헷갈리면 꼭 출력해보면서 less<>() 로 써야할지 혹은 greater<>()로 써야할지 체크해보도록 하자. 

 

 처음에 이 문제의 경우 어떻게 해야지 효율적으로 문제를 해결할까 생각을 해보다가 생각이 안나서 이런식으로 이중 for문을 돌렸는데, 

다른 사람의 풀이를 참고해보자면, 

 

#include <string>
#include <vector>
#include <map>
using namespace std;

vector<int> solution(vector<int> emergency) {
    auto amt = map<int, int>();
    for (auto& e : emergency) { amt[e]; }
    auto order = amt.size();
    for (auto& e : amt) { e.second = order--; }
    for (auto& e : emergency) { e = amt[e]; }
    return emergency;
}

이렇게 map을 사용하는 풀이가 있었고, 처음에는 나같은 경우도 다른 자료구조를 이용해서 수들을 받아서 해결하면 어떨까 했는데, priority_queue를 활용해보는건 어떨가 싶었으나 사용은 하지 않았는데, 이렇게 map을 이용하는 풀이는 생각해보지는 않았다. 

저 위의 코드를 내가 보기 편한 형태로 한번 수정해보면, 

#include <string>
#include <vector>
#include <map>
using namespace std;

vector<int> solution(vector<int> emergency) {
    auto amt = map<int, int>();
    for (auto& e : emergency)
    	amt[e];
    auto order = amt.size();
    for (auto& e : amt) 
    	e.second = order--;
    for (auto& e : emergency) 
    	e = amt[e];
    return emergency;
}

위와 같이 할 수 있을 것이다. 이 풀이에 대해 이해하기 위해서 gpt에 해당 풀이에 대한 설명을 요구하면, 

이와같은 설명을 얻을 수 있다. 

이때 내가 map을 아직 자유자재로 사용하지 못해서 알지못하였는데, 2번 항복에 해당하는, 

 

for (auto& e : emergency) amt[e];: emergency 벡터를 반복하면서 각 원소 e를 키로 사용하여 amt 맵에 항목을 추가합니다. 이때, 값은 기본값인 0으로 설정됩니다. 즉, amt에는 emergency에 등장한 정수들이 키로 들어가며 값은 모두 0으로 초기화됩니다.

 

라는 부분에서 키로 각 항목을 할당하고, 해당 항목은 기본값이 0으로 할당된다는 내용을 잘 이해하면 좋을것 같다.



또 다른 풀이를 확인해보면, 

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> emergency) {
    vector<int> answer;

    for(const auto v : emergency)
    {
        int count = 0;
        for(const auto v2 : emergency)
        {
            count += v2 > v;
        }
        answer.emplace_back(count+1);
    }

    return answer;
}

이와같은 풀이도 볼 수 있었는데, 

이 풀이의 경우는 결국 간략하게 써져있는 이중 for문 풀이로 보여진다. 하지만 내가 작성한 풀이보다 아주 깔끔하게 보여서 보기 좋고 이해하기 쉬운 풀이라고 생각된다. map을 이용한 풀이는 떠올릴 수 없었을 수 있으나, 이런식의 풀이처럼 내가 구상한 풀이법으로 풀더라도 더욱 간결하고 이해하기 쉽게 작성할 수 있도록 노력해보자. 

 

  Comments,     Trackbacks