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을 이용한 풀이는 떠올릴 수 없었을 수 있으나, 이런식의 풀이처럼 내가 구상한 풀이법으로 풀더라도 더욱 간결하고 이해하기 쉽게 작성할 수 있도록 노력해보자.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Lv 0. 외계행성의 나이 - 숫자를 string으로 바꾸고 싶으면? to_string() (0) | 2023.09.18 |
---|---|
Lv 0. 순서쌍의 개수 - 처음으로 시간초과 발생한 문제. (0) | 2023.09.18 |
Lv 0. 배열 자르기 || vector의 emplace_back()과 push_back()에 대하여. (0) | 2023.09.17 |
Lv 0. 짝수의 합 (0) | 2023.09.16 |
Lv 0. 양꼬치 (0) | 2023.09.16 |