Over the limit

[C++]프로그래머스 - 가장 큰 / sort 커스텀 본문

Algorithm/Algorithm 풀이

[C++]프로그래머스 - 가장 큰 / sort 커스텀

ellapk 2021. 5. 15. 01:23

문제 설명

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

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

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

 

제한 사항

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

입출력 예

numbers     return

[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

 

주어진 정수를 개별적으로 취급할 수 있어야 하며, 이어 붙인 후

sort로 비교하여 문자열로 바꾸어 return 해야한다.

 

numbers의 순서를 재배치하여 만드는 과정은 새 벡터를 만들어서 for문 안에 돌리기

 

다만 헷갈리는 부분은 string변환, 그리고 string배열의 정렬이었다. 시도해본적이 없어서 낯설었는데,

타 코드를 보니 어려울 것 없이 변수에 배열 요소를 더한 값을 넣으면 되는 것이었다.

(앞으로도 쉽게 생각하는 습관 들일 것...)

 

string 변환은 학교 과제하면서 한번 써본 적이 있는 것 같은데

to_string -> int to string 이고, 말 그대로 int형을 string형으로 바꿔주는게 전부다.

 

 

다 풀고보니 문제 낸 의도는

문자열 숫자 변환 자유자재 가능하냐 + sort를 적절한 상황에 사용할 수 있냐(오름차순/내림차순) + 벡터 한스푼 정도 인 듯하다.

 

이번 풀이에서는 코드 참조가 많이 필요했다. sort를 오름차순용으로만 사용했는데, 커스텀 함수를

이용한 방법은 처음 사용해보았다.

cmp 내부에서의 비교도, 두개씩 비교하는 방법은 생각해내질 못했었다.

이외에도 다양한 방법들이 존재하니 참고해보자.

 

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

using namespace std;

bool cmp(string A, string B){
    if(A+B>B+A) return true;
    return false;
}

string solution(vector<int> numbers) {
    string answer = "";
    vector <string> tmp;
    for(int i=0;i<numbers.size();i++){
        tmp.push_back(to_string(numbers[i]));
    }
    sort(tmp.begin(),tmp.end(),cmp);
    
    for(int i=0;i<tmp.size();i++) {
    answer+= tmp[i];}
    
    if (answer[0] == '0')
		return "0";
  
    
    return answer;
}