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

jh Seo·2023년 6월 19일
0

프로그래머스

목록 보기
9/32

개요

기능 개발

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

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

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

접근 방식

  1. progresses와 speeds벡터는 사이즈가 같으므로
    progresses의 크기만큼 순회하면 두 벡터가 같이 순회된다.

     for(int i=0;i<progresses.size();i++){
  2. 변수로는

    int curLeftProgress=0,curWorkProgress=0,prevWorkProgress=0,curWorkDone=0;

    이렇게 선언을 해줬고
    각각,

    • 현재 남은진도(100에서 진도 빼준값),
    • 현재 작업이 끝나는데 소요되는 시간 (남은진도/속도),
    • 이전진도중 max값,
    • 현재 완료된 작업들 갯수
  3. 작동 방식은 처음 반복문일 때는(i=0)
    prevWorkProgress에 첫번째 진도가 걸리는 시간을 저장한다.
    그리고 curWorkDone을 1로 설정한다.

    curLeftProgress=100-progresses[i];
    prevWorkProgress= ceil((float)curLeftProgress/speeds[i]);
    curWorkDone=1;
  4. 그 다음 순회부터,
    현재 진도가 걸리는 시간을 구한 후,
    이전 시간보다 적게 걸린다면 curWorkDone값만 +1해주고 패스하고,
    이전 시간보다 많이 걸리면 현재 저장된 curWorkDone값 벡터에 푸시해주고,
    prevWorkProgress에 현재 작업 걸리는 시간 저장한다.

      for(int i=0;i<progresses.size();i++){
           if(i!=0){
               curLeftProgress=100-progresses[i];
               curWorkProgress= ceil((float)curLeftProgress/speeds[i]);
               if(prevWorkProgress>=curWorkProgress){
                   curWorkDone++;
               }
               else{
                   answer.push_back(curWorkDone);
                   prevWorkProgress=curWorkProgress;
                   curWorkDone=1;
               }
  5. 모든 반복문이 끝난 후, 맨 마지막 값은 처리가 안되었으므로

    answer.push_back(curWorkDone);

    push해줘야한다.

전체 코드

#include <string>
#include <vector>
#include <cmath>

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    int curLeftProgress=0,curWorkProgress=0,prevWorkProgress=0,curWorkDone=0;
    for(int i=0;i<progresses.size();i++){
        if(i!=0){
            curLeftProgress=100-progresses[i];
            curWorkProgress= ceil((float)curLeftProgress/speeds[i]);
            if(prevWorkProgress>=curWorkProgress){
                
                curWorkDone++;
            }
            else{
                answer.push_back(curWorkDone);
                prevWorkProgress=curWorkProgress;
                curWorkDone=1;
            }
        }
        else
        {
            curLeftProgress=100-progresses[i];
            prevWorkProgress= ceil((float)curLeftProgress/speeds[i]);
            curWorkDone=1;
        }
    }
    answer.push_back(curWorkDone);
    return answer;
}

문풀후생

테스트케이스 11번에서 계속 틀려서 이해가 안 가서 찾아봤다.

알고보니 ceil함수 내부에 사용되는 두 변수가 둘다
int값이라서 소수점이 제거된 후, ceil함수가 작동을 해서 의미가 없었던 코드였다.

따라서 분자값을 float으로 형변환을 해준 후 ceil함수의 반환값을
int 변수에 넣음으로 해결하였다..

profile
코딩 창고!

0개의 댓글