코딩테스트

[프로그래머스] 퍼즐 게임 챌린지

코딩너구리 2024. 12. 1. 16:45


문제를 구하는 방법은 나와있어 풀기는 쉽지만, 제한 사항에서 정수의 범위가 매우 넓기 때문에, 단순하게 for문을 통해 숙련도를 1씩 증감 하는 방식으로 푼다면 시간제한이 걸린다.

 

이 문제를 해결 하기 위해서는 이진 탐색 알고리즘을 통해 숙련도를 빠르게 찾을 수 있다.

 

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> diffs, vector<int> times, long long limit) {
    
    long long totalTime=0;
    
    long long start=1;
    long long end=limit;
    
    long long level=(start+end) /2;
    
    
    
    while(start<=end)
    {
        totalTime=0;
        
        for(long long i=0; i<diffs.size();i++)
        {
            if(diffs[i]<=level)
            {
                totalTime+=times[i];
            }
            else
            {
                long long error = diffs[i] - level;
                totalTime +=(times[i]+times[i-1])*error+times[i];
            }
        }
        
        if(totalTime<=limit)
        {
            end = level-1;
        }
        else
        {
            start = level+1;
        }
        
        level = (start+end) /2;
        
    }
    
   
    return level+1;
}

https://school.programmers.co.kr/learn/courses/30/lessons/340212#qna