강의로 돌아가기
이성수

[C++] 테스트 케이스 11번만 틀리는데 도와주세요

질문요지

제 풀이가 다른 분들의 풀이 접근 방식과 많이 다르다는 걸 이해하고 있습니다
질문탭에 올라온 11번 반례라고 올라온 테스트 케이스는 전부 통과하는데요...
어째서 제출 누른 11번은 실패하는지 정말 알수가 없어서 도움 요청하고싶습니다 ㅠㅠㅠㅠㅠㅠㅠ

통과한 테스트 케이스들

[96, 94] [3, 3] [2]
[1, 1, 1, 1] [100, 50, 99, 100] [1, 3]
[99, 99, 99, 90, 90, 90] [1, 1, 1, 1, 1, 1] [3, 3]
[95, 90, 99, 98, 80, 99] [1, 1, 1, 1, 1, 1] [1, 3, 2]
[90, 90, 90, 90] [30, 1, 1, 1] [1, 3]
[93, 30, 55, 60, 40, 65] [1, 30, 5, 10, 60, 7] [2, 4]
[55, 60, 65] [5, 10, 7] [3]
[70] [20] [1]
[85, 88, 87] [1, 1, 1] [3]


작성중인 코드―solution.cpp
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <string>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;

    // 벡터를 뒤집어 큐처럼 사용
    reverse(progresses.begin(), progresses.end());
    reverse(speeds.begin(), speeds.end());

    // 우선순위 큐를 사용해서 우선순위 값이 낮을수록 먼저 수행 (빨리 되는 것부터)
    // 우선순위 값은 (100 - 진행도) / 속도
    auto cmp = [&](int a, int b) -> bool
    {
        return (100 - progresses[a]) / speeds[a] > (100 - progresses[b]) / speeds[b];
    };

    priority_queue<int, vector<int>, decltype(cmp)> pq(cmp);

    // 작업을 우선순위 큐에 넣기
    for (int i = 0; i < progresses.size(); ++i)
    {
        pq.push(i);
    }

    // 큐에서 꺼내서 작업 진도를 채우기
    // 작업 진도를 채우는 양은 (100 - 작업량) / 속도 만큼씩 모든 작업 채우기
    // 만약 채운 후에도 해당 인덱스가 완료되지 않았다면 1회 더 채운다
    // 이후 조건 검사, 조건이 맞다면 뒤에서부터 100인 것들을 빼낸다
    // 이걸 반복한다
    // 우선순위 큐에서 빼낼 때 vector size() 검사로 유효 인덱스인지 체크 작업 필요
    while (!pq.empty())
    {
        int idx = pq.top();
        pq.pop();

        int length = progresses.size();

        // 인덱스 유효성 검사 수행
        if (idx >= length) continue;

        // 현재 뽑은 인덱스가 꽉 차게끔 수행
        int calcCount = (100 - progresses[idx]) / speeds[idx];

        // 꽉 채우지 못하면 1회 더 수행함
        if (progresses[idx] + calcCount * speeds[idx] <= 100) ++calcCount;

        printf("idx: %d, calcCount: %d\n", idx, calcCount);

        for (int i = 0; i < length; ++i)
        {
            // 작업 진도를 한번에 채운다
            progresses[i] = min(100, progresses[i] + calcCount * speeds[i]);
            printf("p: %d\n", progresses[i]);
        }

        // 끝부분부터 100인 원소만 빼낸다
        int count = 0;
        for (int i = length - 1; i >= 0; --i)
        {
            if (progresses[i] < 100) break;

            progresses.pop_back();
            speeds.pop_back();
            ++count;
        }

        // 빼낸 적 있다면 이번 루프에서 빼낸 횟수를 answer에 기록
        if (count > 0) answer.push_back(count);
    }

    return answer;
}
2 개의 답변
Jay EPH

[99, 98] [1, 1]

한번 해보시겠어요?

  • 이성수

    [99, 98] [1, 1] 결과 [1, 1] 나옵니다!

    이성수―2023.09.20 14:26
  • Jay EPH

    위 코드로는 결과가 [2]로 나오더군요

    Jay EPH―2023.09.20 14:37
유준혁

반례

입력값 〉 [99, 96, 94], [1, 3, 4]
기댓값 〉 [1, 2]
실행 결과 〉 실행한 결괏값 [3]이 기댓값 [1,2]과 다릅니다.

  • 이성수

    감사합니다!!! 덕분에 통과했어요

    이성수―2023.09.20 14:43
  • Jihun

    감사합니다! 저도 덕분에 통과했습니다!!

    Jihun―2023.09.26 20:26
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.