쌓고 쌓다

[프로그래머스] 가장 큰 수 C++ 풀이 및 해설 본문

알고리즘/프로그래머스

[프로그래머스] 가장 큰 수 C++ 풀이 및 해설

승민아 2023. 7. 20. 11:14

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 방법

사용자 정의 정렬 함수를 등록하여 풀자.

숫자 6과 10이 주어졌을때

두 숫자를 앞 뒤로 순서를 바꿔가며 붙여보고 더 큰 숫자를 만들 수 있는 방법으로 정렬하면 된다.

6과10으로 6 10 = 610, 10 6 = 106을 만들 수 있다.

이때 6이 먼저 오는 방법이 더 큰 수를 만들 수 있음을 이용한다.

 

 

테스트케이스 11은

000과 같은 결과가 나왔을때 0으로 반환하는 경우를 고려해야한다.

앞에서부터 0을 지워나가면 된다.

단, 길이가 0이 되면 안되고, 0이 아닌 숫자를 만나는 경우 앞에서부터 0을 제거하는 과정을 멈추면 된다.

 

전체 코드

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool compare(int a, int b) {
    string s1 = to_string(a);
    string s2 = to_string(b);

    if(stoi(s1+s2)>stoi(s2+s1))
        return true;
    else
        return false;
}

string solution(vector<int> numbers) {
    string answer = "";
    sort(numbers.begin(), numbers.end(), compare);
    for(int i=0; i<numbers.size(); i++) {
        answer += to_string(numbers[i]);
    }
    
    // TEST CASE 11: [0, 0, 0] => 000 => 0  0이 포함된 결과를 처리하자.
    while(1) {
        if(answer[0]=='0' && answer.length()>=2)
            answer.erase(0,1); // (pos, len) pos위치에서 len길이만큼 지움
        else
            break;
    }
    return answer;
}
Comments