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
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
int solution(vector<int> food_times, long long k) {
    int answer = 0;
    int len=food_times.size();
    vector<int> ft;
    long long Max=0;
    for(int i=0;i<len;i++){
        ft.push_back(food_times[i]);
        Max+=food_times[i];
    }
    if(Max<=k)
        return -1;
    sort(ft.begin(),ft.end());
    long long cnt=0;
    int pos=0;
    int depth=1;
    while(cnt<=k){
        cnt+=len;
        if(cnt>k){
            cnt-=len;
            break;
        }
        depth++;
        if(ft[pos]<depth){
            pos++;
            len--;
            while(ft[pos-1]==ft[pos]){
                pos++;
                len--;
            }     
        }
    }
    for(int i=0;i<food_times.size();i++){
        if(food_times[i]<depth)
            continue;
        cnt++;
        if(cnt==k+1){
            answer=i+1;
            break;
        }
    }
    return answer;
}
cs

출처:https://school.programmers.co.kr/learn/courses/30/lessons/42891?language=cpp

 

모든 음식을 먹기위해 전부 순회하는 경우 k가 long long 이므로 효율성 테스트를 통과못할 것이라고 예상했다.

정렬을 시킨후 일정 높이 이상의 범위 사이에서만 순회하면 food_times의 길이만큼 시간이 걸리므로 효율성 테스트 통과 가능!

 

처음엔 vector <pii> 형태로 음식의 번호 까지 ft에 저장하려고 했지만, k가 몇번째 depth에 존재하는지 알면 단순 순회해서 음식번호를 k+1번째에 도달하는 것으로 출력하면 정답이므로, 따로 음식 번호를 관리하지 않았다..

 

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[c++] 스타 수열  (0) 2022.10.09
[c++] 경주로 건설 (다익스트라)  (0) 2022.10.09
[c++] N으로 표현  (1) 2022.10.04
[c++] 아이템줍기 (BFS)  (1) 2022.09.29
[c++] 1차 비밀지도 (구현)  (0) 2022.09.28

+ Recent posts