알고리즘

[프로그래머스] 가장 큰수

staktree 2023. 12. 5. 14:44

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 : 

 

 

 

예시 : 

 

 

해결 : 

numbers 배열 안의 숫자들을 적절히 나열하여 가장 큰 수를 구하는 문제이다.

배열의 값의 가장 큰 자리 수의 숫자가 큰 순서대로 나열하면 해결되지 않을까싶었다. 

각 자릿 수가 일치하는 경우, 다음 자릿 수로 넘어가 비교하였다. 비교하는 두 숫자의 길이가 다른 경우에는 길이가 짧은 숫자를 1의 자리까지 비교한 이후에 가장 큰 자릿 수로 돌아가 길이가 긴 숫자의 1의 자리까지 비교하도록 했다. 중간에 더 큰 수가 발견되면 그대로 결과를 반환한다. 

 

[5352, 535, 53]로 예를 들면, 정답은 "535355352"가 되어야한다. 5352와 53을 비교했을 때, 0번 인덱스는 (5, 5)로 일치하고, 1번 인덱스는 (3, 3)으로 일치한다. 53은 다시 가장 큰 자리수로 돌아와 비교를 반복한다. (5, 5)를 다시 비교하고, 마지막으로 (2, 3)을 비교한다. 2가 더 작은 수이기 때문에 [53, 5352] 순으로 정렬된다. 

 

 

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

using namespace std;

bool cmp(int a, int b)
{
    string aa = to_string(a);
    string bb = to_string(b);
    int aidx = 0;
    int bidx = 0;
    int l = aa.size() > bb.size() ? aa.size() : bb.size();
    int cnt = 0; 
    while(true)
    {
        if(aa[aidx] > bb[bidx]) return true;
        else if(aa[aidx] < bb[bidx]) return false;
        if(cnt == l) return false;
        if(aidx < aa.size()) aidx++;
        if(aidx == aa.size()) aidx = 0;
        if(bidx < bb.size()) bidx++;
        if(bidx == bb.size()) bidx = 0;
        cnt++;
    }
    
    return false;
}

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

 

 

문제 테스트 케이스를 꼼꼼히 생각하지 못해 '맞왜틀'을 하다가 다른 사람의 반례를 참고하여 해결했다. 그러던 중 더 좋은 비교함수 작성법을 발견했다. 

 

bool cmp(int a, int b)
{
    string ab = to_string(a) + to_string(b);
    string ba = to_string(b) + to_string(a);
    return ab > ba;
}

 

 

이 함수를 사용하면 문제가 너무나도 간단해진다...

 

 

 

반례 :

[5352, 535, 53] "535355352"

[0, 0, 0] "0"

'알고리즘' 카테고리의 다른 글

[백준] BOJ 11657번 타임머신  (4) 2023.12.06
[프로그래머스] H-Index  (4) 2023.12.05
[백준] BOJ 1920번 수 찾기  (2) 2023.12.04
[프로그래머스]소수 찾기(C++)  (2) 2023.12.02
[백준] BOJ 7579번 앱  (0) 2023.11.29