코딩테스트

[이코테] 무지의 먹방 라이브

Patti Smith 2024. 1. 24.

 

 

프로그래머스

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

programmers.co.kr

 

for문을 돌면서 매번 다 먹은 음식인지 아닌지 확인하며 k와 비교하는 것은 효율적이지 않다.

 

가장 빨리 먹을 수 있는 음식을 기준으로 해당 음식(가장 빠른)을 다 먹을 때마다 k초와 비교하며 남은 음식의 순서를 비교해가는 것이 핵심이다.

 

빨리 먹을 수 있는 음식은 food_times가 가장 작은 숫자다. 그리고 이 food_time이 가장 작은 순서대로 k와 비교해야하기 때문에 우선순위 큐의 내림차순을 사용했다.

 

큐에서 pop을하면서 (현재 남아 있는 음식의 양) * (현재 가장 빨리 먹을 수 있는 음식이 걸리는 시간) + 현재까지 먹방에 걸린 시간(value)를 k와 비교하며 while문을 실행한다.

 

k와 비교하며 만약 k보다 작다면 이제 음식의 순서에 따라 k초뒤에 먹을 음식을 체크할 수 있다. 이때 음식의 순서는 우선 순위 큐에 집어 넣을 때 미리 집어 넣어 줘야 한다 (음식 시간, 음식 순서)

 

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int solution(vector<int> food_times, long long k) {
    int answer = 0;
    
    int length = food_times.size();
    priority_queue<pair<less<int>, int>> pfood_times;
    
    long long sum_time = 0;
    for(int i = 0; i < length; i++){
        sum_time += food_times[i];
        pfood_times.push(foodtimes[i], i + 1);
    }
    
    if(sum_time <= k) return - 1;
    
    int value = 0;
    int previous = 0;
    
    while(value + (pfood_times.top().first - previous) * length <= k ){
        int now = pfood_times.pop().first;
        value += (now - before) * length;
        length -= 1;
        previous = now;
    }
    
    ector<pair<int, int>> ftimes;
    while (!pfood_times.empty()) {
        ftimes.push_back(make_pair(pfood_times.top().second, -pfood_times.top().first));
        pfood_times.pop();
    }
    
    sort(ftimes.begin(), ftimes.end());
    
    answer = ftimes[k % ftimes.size()].first;
    
    return answer;
}

'코딩테스트' 카테고리의 다른 글

[20546] 기적의 매매법  (1) 2024.01.31
[이코테] 뱀  (0) 2024.01.26
[이코테] 볼링공 고르기  (0) 2024.01.23
[이코테] 만들 수 없는 금액  (0) 2024.01.19
[이코테] 문자열 뒤집기  (0) 2024.01.18

댓글