문제
입출력 예시
스택/큐 카테고리의 문제다.
입출력 예시는 아래와 같다.
작업 [93, 30, 55] , 작업속도 [1, 30, 5]
93%진행된 작업은 하루에 1%씩 진행된다. (7일만 더 일하면 100이 된다 )
30%진행된 작업은 하루에 30%씩 진행된다. (3일만 더 일하면 100을 넘긴다)
55% 진행된 작업은 하루에 5%씩 진행된다. (9일이 더 필요하다)
따라서 7, 3, 9일 씩 필요한데, 첫 작업이 끝났을 때는 이미 두번째 작업이 (3일밖에 안걸림)끝나 있으므로 함께 배포된다. 셋째 작업은 9일이 필요하니까, 첫째 둘째 작업보다 2일이 더 필요하다.
따라서 정답은 [2, 1] 이 된다.
리뷰
작업량이 100이 되면 배포가 가능하니까, speeds 배열 값을 활용해 각 작업이 몇일이 걸리는지 세준다.
소요 시일을 큐에 넣는다. 100개 이하의 작업이니까 for문으로 처리한다
for(int i = 0; i < progresses.size(); i++){ // 작업 마다 몇일 걸리는지 세준다
int day_cnt = 0;
while(progresses[i] < 100){
progresses[i] += speeds[i];
day_cnt++;
}
q.push(day_cnt);
}
그 다음, 큐를 보고 함께 배포할 수 있는 작업 개수를 센다.
큐에서 front 값을 확인한다. 현재 front 값보다 작거나 같을 때 까지 큐에서 pop()한다.
현재 front 값보다 작다면, 현재 작업보다 먼저 끝나있다는 것이다.
현재 front 값보다 크다면, 현재 작업보다 오래걸려서 끝났다는 것이다.
int cnt = 1; // 현재
int front_day = q.front();
q.pop();
while(!q.empty()){
if(q.front() <= front_day){
q.pop();
cnt++;
}else{
answer.push_back(cnt);
cnt = 1;
front_day = q.front();
q.pop();
}
}
answer.push_back(cnt);
코드
#include <string>
#include <vector>
#include <queue>
using namespace std;
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
queue<int> q;
for(int i = 0; i < progresses.size(); i++){ // 작업 마다 몇일 걸리는지 세준다
int day_cnt = 0;
while(progresses[i] < 100){
progresses[i] += speeds[i];
day_cnt++;
}
q.push(day_cnt);
}
int cnt = 1; // 현재
int front_day = q.front();
q.pop();
while(!q.empty()){
if(q.front() <= front_day){
q.pop();
cnt++;
}else{
answer.push_back(cnt);
cnt = 1;
front_day = q.front();
q.pop();
}
}
answer.push_back(cnt);
return answer;
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 베스트앨범 c++ (0) | 2020.11.03 |
---|---|
[프로그래머스] 위장 c++ (0) | 2020.11.03 |
[프로그래머스] 더 맵게 c++ (0) | 2020.11.01 |
[프로그래머스] 전화번호 목록 c++ (0) | 2020.10.31 |
[프로그래머스] 주식가격 c++ 2가지 풀이 (0) | 2020.10.31 |