알고리즘/programmers

[Programmers 코딩테스트 고득점 Kit] 가장 큰 수

꾸준함. 2021. 9. 21. 19:01

문제 링크입니다: https://programmers.co.kr/learn/courses/30/lessons/42746#

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

정렬 기준을 잘 작성해야 하는 문제였습니다.

 

알고리즘은 아래와 같습니다.

1. numbers 벡터를 모두 string으로 변환한 string 벡터를 생성합니다.

2. 정렬을 하는데 정렬 기준은 두 문자열을 합쳤을 때 사전 순서 역순으로 정렬을 진행해줍니다.

3. 2번에서 정렬한 벡터를 순서대로 더한 값이 답이며 이를 반환합니다.

3.1 3번에서 구한 답이 "000000000000"과 같은 형식이라면 "0"만 반환해줘야 합니다.

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(string a, string b)
{
string aConcatB = a + b;
string bConcatA = b + a;
return aConcatB > bConcatA;
}
string eraseLeadingZeros(string s)
{
string result;
bool isLeadingZero = true;
for (char c : s)
{
if (c == '0' && isLeadingZero)
{
continue;
}
isLeadingZero = false;
result += c;
}
return result;
}
string solution(vector<int> numbers) {
vector<string> v;
for (int number : numbers)
{
v.push_back(to_string(number));
}
sort(v.begin(), v.end(), cmp);
string answer = "";
for (string s : v)
{
answer += s;
}
string result = eraseLeadingZeros(answer);
return result.length() ? result : "0";
}
int main(void)
{
vector<int> numbers = { 21, 212 };
cout << solution(numbers) << "\n";
return 0;
}
view raw .cpp hosted with ❤ by GitHub

 

개발환경:Visual Studio 2017

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형