728x90

문제 설명

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

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

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

제한 사항

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

 

어떻게 풀 지 고민한 문제이다.

string으로 변환한 후에 cmp 함수를 어떻게 작성하나 고민했고, 0번째 글자부터 3번째 글까지 하나씩 비교하는 방식을 했었는데 제대로 되지 않았다.

정답 코드를 보니 너무 간단했고, 이런 생각은 어떻게 하는건가 싶다.

 

하나 알게된 점은 compare 함수에서 계속 core dumped 에러가 났는데, 컴파일러 버전에 따라 비교로 들어온 두 인자가 같은 경우 true 를 반환하면 오류가 난다고 한다. 그래서 내 visual studio는 괜찮았는데, 채점 서버에서는 오류가 떴던 것이다.

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/Programmers/%EA%B0%80%EC%9E%A5%20%ED%81%B0%20%EC%88%98.cpp

 

chosh95/STUDY

프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com


C++ 코드

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

using namespace std;
vector<string> str;

bool cmp(string a, string b) {
	if (a + b <= b + a)
		return false;
	return true;
}

string solution(vector<int> numbers) {
	string answer = "";

	//int를 모두 string으로
	for (int i = 0; i < numbers.size(); i++) 
		str.push_back(to_string(numbers[i]));

	//cmp에 따라 정렬
	sort(str.begin(), str.end(), cmp);

	//정렬된 수를 모두 answer에 합한다.
	for (int i = 0; i < str.size(); i++)
		answer += str[i];

	//입력으로 들어온 수가 모두 0인 경우
	if (answer[0] =='0') return "0";

	return answer;
}

int main()
{
	cout << solution({ 30,3,300 });
	cout << solution({ 0,0,0,0 });
}
728x90

+ Recent posts