나만의 작은 도서관

문제 42586. 기능개발 본문

프로그래머스 문제풀이/코드카타

문제 42586. 기능개발

pledge24 2024. 7. 14. 11:37

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

난이도 : Lv.2 

 

문제 요약 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

입력

  • 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses
  • 각 작업의 개발 속도가 적힌 정수 배열 speeds

입력 제한

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

입력 예제

// input
[93, 30, 55] // progresses
[1, 30, 5]   // speeds

// ans
[2, 1]

 

풀이 방식

 progresses는 순서대로 개발되어야 하는 기능들을 순서대로 저장하고 있다. 즉, 순위가 뒤에 있는 기능이 먼저 개발되더라고 순위가 앞에 있는 기능이 먼저 개발되지 않았다면 배포는 하지 않는다. 따라서 예제는 다음과 같다.

 

1번째 기능: (100-93) / 1 = 7일 소요

2번째 기능: (100-30) / 3 = 2.33 = 3일 소요(올림)

3번째 기능: (100-55) / 5 = 9일 소요  

 

위 결과처럼 기능이 개발 완료되는 순간은 [7, 3, 9]이지만 실제로 배포되는 데까지 걸리는 시간은 [7, 7, 9]일 것이다. 따라서 답은 7일에 2개, 9일에 1개로 [2, 1]이 답이 된다.

 

이 문제를 풀기 위해서는 [7, 3, 9]처럼 각 기능이 개발되는 데까지 걸리는 시간을 올림(ceil()함수 이용)으로 구한다. 다음은 저장된 배열을 max()함수를 이용해 앞에 있는 기능이 배포하는 데까지 걸린 시간과 현재 기능이 개발되는 데까지 걸리는 시간 중 큰 값을 저장한다. 여기까지 했다면 [7, 7, 9]가 완성된다.

 

이제 여기서 앞에 있는 수와 동일하면 +1, 그렇지 않으면 현재까지의 cnt를 배열 저장하고, cnt를 1로 되돌린다. 이 과정을 반복하고 마무리하면 정답이 만들어진다. 

 

정답 코드 

더보기
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    
    vector<int> v1(speeds.size());
    for(int i = 0; i < speeds.size(); i++){
        int days = ceil((100.0 - progresses[i]) / speeds[i]);
        if(i == 0){
            v1[i] = days;
            cout << days << ' ';
            continue;
        }
        
        v1[i] = max(days, v1[i-1]);
        cout << v1[i] << ' ';
    }
    
    int cnt = 1;
    int num = v1[0];
    for(int i = 1; i < v1.size(); i++){
        if(num != v1[i]){
            answer.push_back(cnt);
            cnt = 1;
            num = v1[i];
        }
        else{
            cnt++;
        }
               
    }
    
    answer.push_back(cnt);
    
    return answer;
}

'프로그래머스 문제풀이 > 코드카타' 카테고리의 다른 글

문제 87946. 피로도  (0) 2024.07.17
문제 42587. 프로세스  (0) 2024.07.15
문제 42578. 의상  (0) 2024.07.13
문제 131127. 할인 행사  (0) 2024.07.12
문제 12949. 행렬의 곱셈  (0) 2024.07.11