본문 바로가기
Algorithm 💫/Problem Solving

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

by 돼지고기맛있다 2020. 12. 2.
반응형

programmers.co.kr/learn/courses/30/lessons/42586#

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

어훙 증말 나는 거의 다 떠올려놓고 맨날 마지막 핀트가 어긋나는 경우가 있..다아..

속상행...!!!!

하지만 인간은 완벽할 수 없지..후 불완전성의 미일까... 🙊

어.쨋.든 다음의 그림으로 문제를 이해해보자!!!!!!!!!!!!

 

 

사실 맨 처음에는 while을 사용하여 지속적으로 day를 카운팅하고, 그것을 통해 기능이 배포되는 일 수들을 측정할 까 했다. 어떻게 생각해도 비효율적인 방식이었다.

 

그럼 어떻게할까 란 생각이 들었고...

옴매? 그냥 채워야하는 100일 중 남은 일수를 speeds로 나누어 주면 해결될 일이었다.

위와 같은 방식으로 생각하면 100-progressess[i] / speeds[i] 의 식을 도출 할 수 있었다. 나머지가 남는다면 하루를 더 더해주는 계산 또한 필요했다.

 

그렇게 작업 개수만큼 필요한 날의 개수를 계산하여 required_days vector에 저장해주었다.

맨 처음 코드를 작성했을 때에는 단순히 현재 작업보다 뒤에 있는 작업이 크다면 count를 answer에 push해주었다. 이렇게 작성하였을 때에는 두 개의 테스트 케이스를 통과할 수 있었지만... 히든 케이스를 통과할 수 없었다.

 

haha..그 이유는..

 

progresses: [99,1,99,1], speeds: [1,1,1,1] return: [1,3]

 

이 테스트케이스가 통과가 되지 못했다..

음...위의 progresses의 필요 일 수를 계산하면 [1, 99, 1, 99]가 된다. 그럼 제일 처음 마무리 되는 작업은 처음 작업과, 세번째 작업이다. 하지만 세번째 작업은 앞의 두번째 작업이 끝날 때 까지 배포되지 못하니, 첫 번째 작업과 함께 배포될 수 없다.

 

그렇기 때문에 첫번째 배포 때에는 첫번째 기능만 배포된다. 두번째 작업은 99일을 소요한다. 다음 작업은 미리 끝나 있었기 때문에 함께 배포되어야 한다. 문제는 내 이전 코드가 마지막 99일을 고려하지 못했다는 점이다...

 

그래서 방법을 바꾸었다아!!!!!!!!!!!! 🙀🙀🙀🙀

이중 포문을 수행하며 i의 값과 같은 날 배포할 수 있는 조건의 작업들을 찾아(required_days[i]≥required_days[j]) count를 해주고, 이를 answer에 추가해 주는 것이었다..ㅎㅅㅎ

 

이와 같은 작업을 코드로 작성하니 테스트 케이스와 모든 히든 케이스를 통과할 수 있었다 hehe

deque로 접근하는 코드도 있더라... 한번 확인해 보아야 겠구나아!

 

#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<int> required_days;
vector<int> solution(vector<int> progresses, vector<int> speeds)
{
    vector<int> answer;
    for (int i = 0; i < progresses.size(); i++) {
        int days = (100 - progresses[i]) / speeds[i];
        if ((100 - progresses[i]) % speeds[i] != 0)
            days++;
        required_days.push_back(days);
    }
    int sum = 0;
    int count = 1;
    for (int i = 0; i < required_days.size(); i += count) {
        count = 1;
        if (sum >= progresses.size())
            break;
        for (int j = i + 1; j < required_days.size(); j++) {
            if (required_days[i] >= required_days[j])
                count++;
            else
                break;
        }
        answer.push_back(count);
        sum += count;
    }
    return answer;
}
반응형

댓글