LUCKYNUM 문제 오답 케이스를 못 찾고 있습니다.

  • porcosedol
    porcosedol

    LUCKYNUM
    안녕하세요. 몇달째 LUCKYNUM 문제에 막혀 있습니다.
    구현한 방식은 lucky number와 같으면 그대로 출력하고
    모두 lucky number보다 작으면 그대로 큰 수부터 정렬
    모두 lucky number보다 크면 그대로 작은 수부터 정렬
    섞여있으면 큰 수부터 정렬한 것과 작은 수부터 정렬한 것을
    lucky number와 차이를 비교했습니다.
    이렇게 푸는 것이 맞는 것 같고 생각나는 테스트 케이스도 많지 않은데
    도무지 어떤 케이스에 오답이 발생하는지 못 찾고 있습니다. ㅠㅠ

    #include <iostream>
    #include <vector>
    #include <string>
    #include <cmath>
    using namespace std;
    
    vector<int> make_dist(const string& src_string) {
        vector<int> dist(10, 0);
        for (auto c : src_string) {
            int i = c - '0';
            dist.at(i)++;
        }
        return dist;
    }
    
    string make_up_number(vector<int> dist, int nearest, int lucky_id) {
        string up_string;
        if (nearest >= 0) {
            while (dist.at(lucky_id) > 0) {
                dist.at(lucky_id)--;
                up_string.push_back(char(lucky_id + '0'));
            }
            while (dist.at(nearest) > 0) {
                dist.at(nearest)--;
                up_string.push_back(char(nearest + '0'));
            }
        }
    
        for (int i = 0; i < dist.size(); i++) {
            while (dist.at(i) > 0) {
                up_string.push_back(char(i + '0'));
                dist.at(i)--;
            }
        }
        return up_string;
    }
    
    string make_low_number(vector<int> dist, int nearest, int lucky_id) {
        string down_string;
        if (nearest < dist.size()) {
            while (dist.at(lucky_id) > 0) {
                dist.at(lucky_id)--;
                down_string.push_back(char(lucky_id + '0'));
            }
            while (dist.at(nearest) > 0) {
                dist.at(nearest)--;
                down_string.push_back(char(nearest + '0'));
            }
        }
    
        for (int i = dist.size() - 1; i >= 0; i--) {
            while (dist.at(i) > 0) {
                down_string.push_back(char(i + '0'));
                dist.at(i)--;
            }
        }
        return down_string;
    }
    
    string find_near_lucky_num(string& _1st, string& _2nd, int lucky_num) {
        int bNum = 0;
        int sNum = 0;
        int kNum = 0;
        for (int i = 0; i < _1st.size(); i++) {
            bNum = bNum * 10 + (int)(_1st.at(i) - '0');
            sNum = sNum * 10 + (int)(_2nd.at(i) - '0');
            kNum = kNum * 10 + lucky_num;
            if ((bNum - kNum) < (kNum - sNum)) {
                return _1st;
            }
            else if ((bNum - kNum) > (kNum - sNum)) {
                return _2nd;
            }
        }
        return _1st;
    }
    
    int main()
    {
        int test_num;
        cin >> test_num;
        while (test_num--) {
            string src_string;
            int lucky_id;
            cin >> src_string >> lucky_id;
            vector<int> dist = make_dist(src_string);
            int nearest_upper = -1;
            for (int i = lucky_id + 1; i < 10; i++) {
                if (dist.at(i)) {
                    nearest_upper = i;
                    break;
                }
            }
            int nearest_lower = 10;
            for (int i = lucky_id - 1; i >= 0; i--) {
                if (dist.at(i)) {
                    nearest_lower = i;
                    break;
                }
            }
    
            if (nearest_upper == -1 && nearest_lower == 10) {
                cout << src_string << endl;
            }
            else if (nearest_upper == -1) {
                cout << make_low_number(dist, nearest_lower, lucky_id) << endl;
            }
            else if (nearest_lower == 10) {
                cout << make_up_number(dist, nearest_upper, lucky_id) << endl;
            }
            else {
                auto up_num = make_up_number(dist, nearest_upper, lucky_id);
                auto low_num = make_low_number(dist, nearest_lower, lucky_id);
                cout << find_near_lucky_num(up_num, low_num, lucky_id) << endl;
            }
        }
        return 0;
    }
    
    
    
    {{vXD0OhLiNI9PeCyC}}
    

    9년 전
1개의 댓글이 있습니다.
  • riceluxs1t
    riceluxs1t

    '섞여있으면 큰 수부터 정렬한 것과 작은 수부터 정렬한 것을'
    이부분에 대한 로직을 점검해야 할 것 같습니다.


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.