나만의 작은 도서관

문제 42746. 가장 큰 수 본문

프로그래머스 문제풀이/코드카타

문제 42746. 가장 큰 수

pledge24 2024. 7. 26. 09:17

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

 

난이도 : Lv.2

 

문제 요약 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

입력

  • 0 또는 양의 정수가 담긴 배열 numbers

입력 제한

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입력 예제

// input
[6, 10, 2]

// ans
"6210"

 

풀이 방식

c++의 힘을 빌린 문제이다. c++에는 cmp를 통해 정렬기준으로 변경할 수 있는데, 이 기준만 잘 설정하면 이번 문제는 날로(?) 먹을 수 있다.

필자가 문제를 풀 때는 숫자의 가장 큰 자리수를 기준으로 내림차순으로 정렬하였다. 

 

정답 코드 

더보기
#include <string>
#include <vector>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

bool cmp (int a, int b){

    int temp_a = a;
    int temp_b = b;
    
    while(temp_a >= 10.0) temp_a/=10;
    while(temp_b >= 10.0) temp_b/=10;
    
    if(temp_a == temp_b){
        string str_a = to_string(a);
        string str_b = to_string(b);
        
        return str_a + str_b > str_b + str_a;
    }
    return temp_a > temp_b;
}
string solution(vector<int> numbers) {
    string answer = "";
    
    sort(numbers.begin(), numbers.end(), cmp);
    
    for(int elem : numbers){
        answer += to_string(elem);
    }
    
    if(answer.length() > 0 && answer[0] == '0') return "0";
    return answer;
}