Judge
Programmers - 가장 큰 수
깡구_
2022. 6. 24. 11:15
title: Programmers - 가장 큰 수
date: 2022-06-20
tags:
- Algorithm
https://programmers.co.kr/learn/courses/30/lessons/42746
문제 요약
데이터로 들어온 숫자들을 이어 붙여 가장 큰 수를 만들어야 한다. 매우 큰 수가 될 수 있으므로 문자열로 바꾸어 return한다.
문제 풀이
문자열로 return하라는 의미는 모든 수를 비교하는 것이 아닌, 올바른 방식으로 수를 정렬한 후 그대로 이어 붙이라는 뜻이다.
algorithm의 sort 함수를 사용, 비교 함수인 bCompare 함수를 만들어 정렬한다. 정렬시 두 숫자를 붙인 문자열로 바꾸어 비교하여 더 큰 수가 만들어지는 순서대로 정렬한다.
추가적으로 프로그래머스는 itoa를 지원하지 않기 때문에 sprintf 함수를 이용하였다.
프로그램
#include <string>
#include <vector>
#include <algorithm>
#include <cstring>
using std :: vector ;
using std :: string ;
bool bCompare ( int iNum1 , int iNum2 )
{
char crgNum1 [ 5 ] = { 0 , } ;
char crgNum2 [ 5 ] = { 0 , } ;
char crgTemp1 [ 9 ] = { 0 , } ;
char crgTemp2 [ 9 ] = { 0 , } ;
sprintf ( crgNum1 , "%d" , iNum1 ) ; // itoa not supported at Programmers
sprintf ( crgTemp1 , "%d" , iNum1 ) ;
sprintf ( crgNum2 , "%d" , iNum2 ) ;
sprintf ( crgTemp2 , "%d" , iNum2 ) ;
if ( atoi ( strcat ( crgTemp1 , crgNum2 ) ) > atoi ( strcat ( crgTemp2 , crgNum1 ) ) ) // strcat edit dest, so I made another 2 char array
return true ;
return false ;
}
string solution ( vector < int > numbers )
{
string answer = "" ;
int * ipTemp = numbers.data () ;
std :: sort ( numbers.begin () , numbers.end () , bCompare ) ;
if ( 0 == ipTemp [ 0 ] ) // If Biggest number is 0, then return must be "0" instead "00000...."
return "0" ;
for ( int i = 0 ; i < numbers.size () ; ++i )
{
answer += std :: to_string ( ipTemp [ i ] ) ;
}
return answer ;
}