[프로그래머스/C++] 가장 큰 수

다곰·2023년 6월 29일
0

우당탕탕 코테준비

목록 보기
57/98

✅ LV.2

✏️ 1차 솔루션

숫자를 문자열로 바꿔서 오름차순 정렬하기

🚨 1차 trouble

330 이 있을 때 위 방법으로 연결하면 303 이 제일 크다고 판단하지만 실제로는 330 이 더 커서 일반 정렬을 사용하면 오류가 발생

✏️ 2차 솔루션

뒤에 0 이 붙는 30, 300 같은 수들이 문제이기 때문에 0 을 제외한 값과 0의 개수를 기록해서 나중에 문자열을 만들 때 0 이 많을 수록 나중에 합치는 것으로 풀이

🚨 2차 trouble

시간초과 발생

✏️ 최종 솔루션

커스텀 정렬하기 - 두 값을 연결했을 때 더 큰 값을 먼저 출력

bool cmp(string a, string b) {
    return a+b>b+a;
}

예를 들어 1과 2를 비교한다면 12보다 21이 더 크기 때문에 2 다음에 1이 출력하게 되는 것

❗️ 실제 return 값으로 a+b 가 출력되는 것이 아니라 더 큰 조합으로 출력 순서를 정하는 방식
❗️ 주어진 숫자가 오직 0 밖에 없는 경우 예외처리 필요

📌 self feedback

첫 자리가 같을 경우, 0이 붙는 값들을 처리하기 위해 정렬을 커스터마이징하는 것이 관건이었음
파라미터를 연산한 값에 따른 정렬은 시도해보지 못했는데 다른 문제에서도 응용해볼 수 있을 것 같음

✏️ 최종 code

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

using namespace std;

bool cmp(string a, string b) {
    return a+b>b+a;
}

string solution(vector<int> numbers) {
    string answer = "";
    
    vector<string> v;
    for(int i=0;i<numbers.size();i++) {
        v.push_back(to_string(numbers[i]));
    }
    
    sort(v.begin(),v.end(),cmp);
    
    for(int i=0;i<v.size();i++) {
        answer+=v[i];
    }
    
    if(v[0]=="0") answer="0";
    
    return answer;
}
profile
다교미의 불꽃 에러 정복기

0개의 댓글