가장 큰 수 / 정렬

2025. 4. 23. 13:03·공부/Code Cata

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

처음에 이 문제를 보고, 모든 경우의 수를 조합해야된다는 생각에 바로 브루트 포스로 문제를 해결하였다.
코드 작성을 끝마치고 나서야 제한 사항이 눈에 들어왔고 10만이라는 숫자를 뒤늦게 확인하였다..
당연히 시간 초과가 날 것이라고 판단하고 다시 문제를 어떻게 해결해야될지 고민이 되었다.

입출력의 예를 살펴보니 앞자리의 숫자가 큰 숫자가 우선 순위가 높다는 것을 알게 되고, 각 숫자의 첫번째 자리 숫자를 비교해야되나 하는 생각이 들던 찰나에 3, 30, 34 와 같이 앞자리의 숫자가 같을 경우엔 비교를 할 수 없음을 깨달았다.

아에 priority queue에서 비교 함수를 작성해 a + b 조합과 b + a 조합을 직접 비교하는 것으로 결정하고 재 구현하였다.

✅ priority queue 사용 코드

#include <string>
#include <vector>
#include <queue>

using namespace std;

string solution(vector<int> numbers)
{
    auto cmp = [](const string& a, const string& b)
        {
            return a + b < b + a;
        };

    priority_queue<string, vector<string>, decltype(cmp)> pq(cmp);

    for (int number : numbers)
    {
        pq.push(to_string(number));
    }

    string result;
    while (!pq.empty())
    {
        result += pq.top(); pq.pop();
    }

    if (result[0] == '0') result = "0";

    return result;
}
priority queue 우선순위를 사용해서 문제는 해결하였지만 과연 이게 최선인지 고민해본 결과,
pq는 각 요소에 대해 push되는 상황에 정렬을 유지해야되기 때문에 비용이 지속적으로 발생할 것 같다는 생각이 들었다.
주어진 numbers 배열을 string으로 변환해서 저장한 후에 한 번에 sort를 사용해 정렬하는게 어떨까 싶었다.

 

✅ sort algorithm 사용 코드

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

using namespace std;

string solution(vector<int> numbers)
{
    vector<string> str_numbers;

    for (int number : numbers)
    {
        str_numbers.push_back(to_string(number));
    }

    sort(str_numbers.begin(), str_numbers.end(), [](string a, string b)
        {
            return a + b > b + a;
        });

    string result;
    for (string number : str_numbers)
    {
        result += number;
    }

    return result;
}
sort로 딱 한 번 정렬할 수 있어 불필요한 오버헤드를 줄였고, 코드 또한 더 간결하게 표현되었다.

'공부 > Code Cata' 카테고리의 다른 글

쿼드압축 후 개수 세기 / 재귀  (0) 2025.04.24
소수 찾기 / 순열, DFS  (0) 2025.04.24
다리를 지나는 트럭 / 큐  (0) 2025.04.23
숫자 변환(BFS)  (0) 2025.04.11
롤케이크 자르기  (0) 2025.04.01
'공부/Code Cata' 카테고리의 다른 글
  • 쿼드압축 후 개수 세기 / 재귀
  • 소수 찾기 / 순열, DFS
  • 다리를 지나는 트럭 / 큐
  • 숫자 변환(BFS)
동그래님
동그래님
  • 동그래님
    개발자 동그래
    동그래님
  • 전체
    오늘
    어제
    • 분류 전체보기 (210)
      • 공부 (51)
        • Code Cata (50)
      • 내배캠 (151)
        • TIL (50)
        • C++ (37)
        • Unreal Engine (48)
        • GAS(Gameplay Ability System.. (16)
      • Project (7)
        • Gunfire Paragon (5)
        • Arena Fighters (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    동그래님
    가장 큰 수 / 정렬
    상단으로

    티스토리툴바