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

  • User Avatar
    porcosedol

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


    ~~~ c++
    #include
    #include
    #include
    #include
    using namespace std;

    vector make_dist(const string& src_string) {
    vector dist(10, 0);
    for (auto c : src_string) {
    int i = c - '0';
    dist.at(i)++;
    }
    return dist;
    }

    string make_up_number(vector 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 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 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;
    

    }


    11년 전
1개의 댓글이 있습니다.
  • User Avatar
    riceluxs1t

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


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