[Programmers] 가장 큰 수

bin1225·2022년 12월 30일
0

Algorithm

목록 보기
10/43

정답률도 높고 도전한 사람도 꽤 많아서 도전해봤는데, 보니까 이전에도 몇 번 푸려다가 못 풀었었다.

처음에 떠올린 방법은 숫자마다 가중치를 계산하고, 그 값으로 정렬하는 것이었다.
결국 앞에 있는 수가 클수록 이득이기 때문에, 맨 앞자리부터 가중치 1000, 100, 10 ,1 를 곱해준다.
여기서 뒷자리가 맨 앞자리보다 작으면 오히려 차이 * 가중치만큼 값을 빼주는 식이었는데,
이게 하면 할수록 예외가 계속 발견되고 결국엔 818 81/ 676 67 같이 중간까지 같고 뒤에 뭐가 더 붙는 경우에 대해서 확실히 처리하지 못했다.

몇 번 인지했지만 그럼에도 안 고쳐지는게, 나는 한 풀이에 꽂히면 다른 풀이를 생각하지를 못한다. 그래서 계속 삽질을 하게 되는 것 같다. 뭔가 꼴에 자존심이랍시고 다른 사람 풀이도 안 보고 풀겠다고 오기를 쓰는데, 이거 아마 질문하기 참고 안 했으면 이틀은 더 이 풀이로 고민했을 것 같다.

삽질 하루종일 한 코드

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

string solution(vector<int> numbers) {
    string answer = "";
    vector<pair<int,string>> v;
    
    for(int i=0; i<numbers.size();i++){
        int n = numbers[i];
        string s =to_string(numbers[i]);
        int val=(s[0]-'0')*10000;
        int tmp=1000;
        
        for(int j=1;j<s.size();j++)
{                        
            if(s[0]==s[j]){
                if(s[j]>s[j-1]) val+=s.size();
                if(s[j]<=s[j-1]) val-=s.size();
            }
            if(s[0]<s[j]){
                val+=(s[j]-'0')*tmp;
            }
            else val-=((s[0]-s[j]))*tmp;
            tmp/=10;
        }
      
        //cout<<val<<endl;
        v.push_back(make_pair(val, s));
    }
    
    sort(v.begin(), v.end());
    
    for(int i=v.size()-1;i>=0;i--){
        answer+=v[i].second;
    }

    return answer;
}

사실 실제 풀이는 생각보다 간단했다.
string 으로 두 값을 순서를 바꿔가면서 조합하고, 더 큰 경우로 배치해주면 되는 것이었다.
생각보다 단순하게 생각해야지 풀리는 문제들도 있는 것 같다.

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool compare(int n1, int n2){
    string s1 = to_string(n1);
    string s2 = to_string(n2);
    int n3 = stoi(s1+s2);
    int n4 = stoi(s2+s1);
    
    return n3>n4;
    
}

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

0개의 댓글