https://programmers.co.kr/learn/courses/30/lessons/42586
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는
programmers.co.kr
1) 풀이
작업의 진행상황(progresses)과 진행속도(speeds)가 들어있는 벡터가 각각 하나씩 주어진다.
벡터 사이즈와 작업의 인덱스(ex. progresses idex 0에 들어있는 작업=speeds idex 0에 들어있는 작업)
가 동일하므로, 각각의 벡터에 동일한 인덱스의 값을 확인하고 작업을 완료할 때까지의 날짜를 구하면 된다.
우선, 100에서 progresses의 요소를 뺀 값을 구한다. (100%가 될 때까지 얼마나 남았는지)
그리고 그 값을 speeds의 요소로 나누고, 만약 speeds의 요소가 딱 나눠떨어지지 않는다면 1을 더해준 값을 구한다.
그렇게 구한 최종 값을 큐(queue)를 하나 만들어 저장한다.
이 과정을 벡터의 사이즈만큼 반복하면, 작업이 끝나기까지 남은 일수가 저장된 큐가 남는다.
그 큐가 빌 때까지, 큐의 front를 기준으로 그 뒤의 값들을 확인한다.
(큐의) front보다 값이 작거나 같다면 front가 배포될 때 함께 배포될 수 있으나,
(같으면 같이 끝나서 배포 가능, 값이 작다면 이미 작업은 완료되었으나 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포될 수 있으므로)
값이 크다면 함께 배포될 수 없으므로
front보다 값이 작거나 같을 동안 배포작업의 수를 저장하는 변수를 1씩 늘려준다.
front보다 값이 크거나 큐가 빈다면, 1씩 늘려주는 작업을 멈추고 answer 벡터에
배포작업의 수를 저장하는 변수를 넣어준다.
그렇게 큰 어려움은 없었던 문제! 하지만 해당 문제를 정말 깔끔하게 푼 분이 계시길래
그 코드를 출처를 남기고 밑에 참고자료에 첨부한다!
이 세상에는 코드 잘 짜는 사람이 너무 많다.. 모두 존경🙏
2) 최종 소스코드
#include <string>
#include <vector>
#include <queue>
using namespace std;
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer; //정답 배열
queue<int>date; //남은 일자 저장
for(int i=0;i<progresses.size();i++){
int num=100-progresses[i];
int d=num/speeds[i]; //작업에 걸리는 날짜
if(num%speeds[i]!=0) d+=1; //만약 나눠서 딱 떨어지지 않으면 하루 더 걸림
date.push(d);
}
while(!date.empty()){
int f=date.front();
int cnt=1; //배포되는 작업량. 함께 배포되는 것이 없으면 기본적으로 1개만 배포됨.
date.pop();
while(f>=date.front()&&!date.empty()){
cnt++;
date.pop();
}
answer.push_back(cnt);
}
return answer;
}
3) 참고자료
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스/JavaScript] 문자열 내림차순으로 배치하기 (0) | 2022.09.06 |
---|---|
[프로그래머스/c++] 올바른 괄호 (0) | 2021.06.28 |
[프로그래머스/c++] 프린터 (0) | 2021.06.23 |
[프로그래머스/c++] 짝지어 제거하기 (0) | 2021.06.18 |
[프로그래머스/c++] 폰켓몬 (0) | 2021.06.16 |