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

 

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

 

프로그래머스

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

programmers.co.kr


 

해결전략

 

스택 Stack

나눗셈 올림

 

x와 y가 양의 정수,  x / y의 결과값을 올림하기 위한 코드

 int ceilResult = x / y + ( x % y !=0 );

 

올림 함수 : ceil()
내림 함수 : floor()

-  올림 함수와 내림 함수는 소수형인 double, float형 일 때는 효과적이나 주어진 값이 정수이면 위의 코드 방식이 더 수월하다.   


 

코드

 

#include <vector>
#include <stack>
using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    stack<int> myStack; //시간값을 넣는 stack

    for(int i= progresses.size()-1; i>=0; i--)
    {   
        int x = (100-progresses[i]) / speeds[i] + ((100-progresses[i]) % speeds[i] != 0);
        myStack.push(x);
    }
       
    while(!myStack.empty())
    {
        int prev = myStack.top();
        myStack.pop();
        int cnt = 1;

        if(!myStack.empty())
        {
            while (prev >= myStack.top())
            {
                myStack.pop();
                cnt++;

                //stack이 완전히 비어버리면 while 조건문에서 터져버리니 break로 빠져나가게 만들어준다.
                if (myStack.empty()) break;
            }
        }       

        answer.push_back(cnt);
    }    

    return answer;
}

 

 

 

 

x와 y가 양의 정수,  x / y의 결과값을 올림하기 위한 코드

 int ceilResult = x / y + ( x % y !=0 );

 

	for(int i= progresses.size()-1; i>=0; i--){
        int x = (100-progresses[i]) / speeds[i] + ((100-progresses[i]) % speeds[i] != 0);
        myStack.push(x);
    }
  • 반복문에서는 각 작업에 대해 남은 작업량(100 - 현재 진행률)을 작업 속도로 나눈 값(=완료까지 필요한 시간)을 계산
  • 만약 남은 작업량이 속도로 딱 나눠떨어지지 않으면 하루가 추가로 필요하므로, (100-progresses[i]) % speeds[i] != 0 조건식으로 확인하여 하루를 추가.
  • 그렇게 구한 시간 값을 스택에 넣는다.