알고리즘 문제/C++

[프로그래머스] Level2 : 기능개발 - C++

lingk 2020. 12. 19. 19:46

문제

programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr


코드설명

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    queue<int> time;
    int tmp1;
    int tmp2;
    int ans;
    
    for(int i = 0 ;i < progresses.size();++i)
    {
        int t = 0;
        while(progresses[i] < 100)
        {
            progresses[i] += speeds[i];
            ++t;
        }
        time.push(t);
    }
    ans = 1;
    if(!time.empty())
    {
        tmp1 = time.front();
        time.pop();
    }
    else
        return answer;
    
    while(!time.empty())
    {
        tmp2 = time.front();
        time.pop();
        if(tmp1 < tmp2)
        {
            answer.push_back(ans);
            tmp1 = tmp2;
            ans = 1;
        }
        else
            ans++;
        
    }
    answer.push_back(ans);
    return answer;
}

 

 

각각의 기능들이 100%에 도달하기까지 걸리는 시간은 자료형이 queue인 time에 저장한다.

더보기
    for(int i = 0 ;i < progresses.size();++i)
    {
        int t = 0;
        while(progresses[i] < 100)
        {
            progresses[i] += speeds[i];
            ++t;
        }
        time.push(t);
    }

기준이 되는 tmp1과 time의 가장 앞에 있는 tmp2를 비교하였다. tmp1은 자신보다 큰 tmp2를 만나기 전까지 모든 기능들을 동시에 배포할 수 있다. 따라서 tmp1이 tmp2보다 크거나 같은 경우에는 ans만 증가시켜준다. tmp1이 자신보다 큰 tmp2를 만나면 이때까지의 기능들의 개수를 저장한 ans를 answer벡터에 추가시켜주고, 해당 tmp2는 기준이 된다. 따라서 tmp1에 tmp2를 대입시켜주고, ans는 1로 초기화 시켜주었다.

time이 모두 pop되어 while문을 빠져나오면, 마지막으로 저장된 ans는 아직 벡터 answer에 push되지 않았기 때문에 이 값 또한 넣어준다.

더보기
    ans = 1;
    if(!time.empty())
    {
        tmp1 = time.front();
        time.pop();
    }
    else
        return answer;
    
    while(!time.empty())
    {
        tmp2 = time.front();
        time.pop();
        if(tmp1 < tmp2)
        {
            answer.push_back(ans);
            tmp1 = tmp2;
            ans = 1;
        }
        else
            ans++;
        
    }
    answer.push_back(ans);
반응형