[프로그래머스] [C++] 기능개발 (stack, queue)

2021. 3. 23. 19:37알고리즘/프로그래머스

1. 문제

 

기능들을 개발하려고한다.

 

각 기능은 각각 먼저 빌드되어야하는 기능들이 있으며

 

빌드 되어야하는 순서대로 벡터에 진도율(최대100%)이 주어지고 하루에 진행하는 퍼센트가 주어질때

 

한번에 빌드되는 기능의 개수들을 담은 벡터를 리턴하여라

 

 

 

 

2. stack, queue

 

빌드 되어야하는 순서대로 벡터가 주어지니

 

이것의 첫번째 원소를 큐의 front, 스택의 top으로 보고 문제를 풀어도 상관없다.

 

100%까지 진행하도록 time을 설정하고 다음 원소들 중 100%가되는 모든 원소를 pop하면 문제가 해결된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <string>
#include <vector>
#include <cmath>
 
using namespace std;
 
vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    int time{0}, idx{0};
    while(idx < progresses.size())
    {
        int count{1};
        time += ceil((100.0 - progresses[idx] - time*speeds[idx])/speeds[idx]);
        idx++;
        while(idx < progresses.size() && progresses[idx] + time*speeds[idx] >= 100
        {
            count++;
            idx++;
        }
        answer.push_back(count);
    }
    return answer;
}
cs

 

 

 

3. 코드 개선점

이 문제는 time 즉 총 몇일이 지났는지 계산할 필요없다.

 

첫번째 while문에서 계산되는 time 은 항상 앞서 계산 된 time보다 커야한다.

 

만약 time이 앞서보다 작은 값이 나온다면 pop되어야 하기 때문이다.

 

그리고 따로 올림계산을 할필요가 없이 99%까지의 횟수에 1을 더면 자동으로 올림이 된다. 

 

또한 다른 풀이에서 v.back()++; 가 인상 깊었다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
#include <vector>
 
using namespace std;
 
vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    int idx{0};
    while(idx < progresses.size())
    {
        int count{1};
        int time{(99 - progresses[idx])/speeds[idx] +1};
        idx++;
        while(idx < progresses.size() && progresses[idx] + time*speeds[idx] >= 100
        {
            count++;
            idx++;
        }
        answer.push_back(count);
    }
    return answer;
}
cs

 

 

 

 

코딩테스트 연습 - 기능개발 | 프로그래머스 (programmers.co.kr)