Problem Solving/프로그래머스

[프로그래머스/c++] 기능개발

세고래 2021. 6. 23. 22:31

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) 참고자료

출처: 코딩테스트 연습 - 스택/큐 - 기능개발 - 다른 사람의 풀이

 

728x90