programmers : https://programmers.co.kr/learn/challenges?selected_part_id=12198

 

programmers 정렬 level2 가장 큰 수 문제입니다.

 

문제를 푸는 방법은 2가지가 있습니다. (+힌트 는 맨마지막에.. )

 

핵심은 수를 대체 어떤식으로 비교하냐 인데

예제의 6 2 10은 이해하셨겠지만 6210이 최대의 수가 됩니다.

예제에서 큰 힌트를 주었습니다. 3 과 30 입니다.

3, 30 => 330, 303 둘 중에서는 330이 더 크게되니 3이 30보다 크게끔 만들어야 한다는 뜻입니다.

 

애초에 범위는 10만이기 때문에 n^2로 해결할 수 없습니다. 즉 브루트포스가 불가능하단 소립니다.

 

방법1 : 수를 직접 범위내의 자릿수까지 만들어주는 방법

문제에서 수는 4자리 이하로만 주어진다고 했습니다. 이건 정말 큰 힌트가 됩니다.

모든 수를 4자리 이하로 만들어버리면 대수비교가 가능해집니다.

예제를 보면 6000, 2000, 1000 이렇게 만들 수 있는 것입니다.

결국 그대로 정렬되게 되고, 6,2,10만 따오면 되는 것입니다.

 

그럼 3과 30은 어떻게 비교할까요?

3000, 3000이 되기때문에 무작정 *10 을 해서는 안된다는 뜻이 됩니다.

그렇다고 무작정 뒤에 임의의 숫자를 집어넣는다 생각할 수 있는데 

3999, 3099 는 좋은 비교대상이 되겠지만, 3, 34도 임의의 숫자 9? 로도 가능할까요?

3999, 3499 를 비교하면 3>34 가 되지만, 334 와 343 은 343이 더 크게됩니다.

즉, 자기자신을 뒤에 계속 이어붙여줌으로써 문제를 해결할 수 있습니다.

3333, 3434 이런식이 되게 됩니다.

 

방법2 : 스트링을 합친 비교

정말 간단한 방법입니다.

3과 34를 예를 들면

 

sort의 compare 함수를 구현할 때 3+34 와 34+3 을 비교하는 것입니다.

문자열은 결국 334, 343이 되고 343이 더 큰값이 되어 34>3 이 되게끔 바로 정렬이 가능합니다.

 

아래는 방법2로 구현한 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
 
bool cmp(string& a, string& b) {
    return (a + b) > (b + a);
}
 
string solution(vector<int> numbers) {
    string answer = "";
    vector<string> v;
    for (int i = 0; i < numbers.size(); i++) v.push_back(to_string(numbers[i]));
 
    sort(v.begin(), v.end(), cmp);
 
    bool check = false;
    for (int i = 0; i < v.size(); i++) {
        answer += v[i];
        if(v[i] != "0") check = true;
    }
    
    if(!check) answer = '0';
 
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

네.. 11번 테스트케이스가 계속 틀리신다구요? 저도 계속 틀렸습니다

코드 24줄이 보이실 겁니다.

수가 중복된다는 말은 문제설명에 없었습니다.

즉 0이 중복되서 나오게된 케이스만 고려하게 되면, 00000... 이라는 답이 만들어지게 됩니다.

이럴 때는 0만 출력해주시면 됩니다.

'algorithm > programmers' 카테고리의 다른 글

programmers 전화번호 목록  (0) 2020.03.10
programmers H-Index C++  (0) 2020.03.10
programmers K번째수  (0) 2020.03.10
programmers 여행경로  (0) 2020.03.10
programmers 단어 변환  (0) 2020.03.09

+ Recent posts