[PS] 기능개발
2025. 6. 30. 17:13

문제

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

각 기능의 개발 완료 일수를 계산해,

앞 기능이 완료될 때 함께 묶여 몇 개씩 배포되는지 구하는 문제.

 

풀이

배포되어야 하는 순서대로 배포되어야 하므로,

선입선출 자료구조인 를 사용하여 풀어보았다.

 

먼저, 작업에 필요한 일자를 계산하고

해당 일자를 계산해서 배열 순서대로 큐에 넣되,

pop시에는 해당 일자보다 같거나 작은 것들도 같이 pop한다.

이때, pop을 몇 번 했는지 count하여 정답 배열에 push한다.

 

1. 작업에 필요한 일자 계산하기

작업량이 100%가 되면 완료된다.

따라서 100에서 progresses[i]를 빼고, speed로 나누면 해당 몫이 남은 일자이다.

이때, 나머지가 있는 경우에 따라 다르게 계산한다.

  • 나머지가 있는 경우, 계산 값에서 +1 하여 저장
  • 나머지가 없는 경우, 계산 값 그대로 저장
[예시]
progresses = {93, 30, 55} , speed = {1, 30, 5}
1. (100-93 = 7) / 1 = 7일
2. (100-30 = 70) / 30 = 2, 나머지가 있으므로 3일
3. (100-55 = 45) / 5 = 9일
따라서 q = {7, 3, 9}

 

2. pop 횟수 count

큐가 빌 때 까지 pop하면 작업을 모두 완료한 상태가 된다.

따라서 큐가 빌 때 까지 pop을 하는데,

pop하려고 하는 q.front()보다 작거나 같은 수가 있으면 작업을 같이 배포할 수 있으므로 같이 pop한다.

이때, pop과 동시에 count에 1을 더해주고,

더이상 pop할 수 없으면 정답 배열에 count를 push한다.

 

CODE

#include <string>
#include <vector>
#include <queue>

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    queue<int> q;
    
    for (int i = 0; i < progresses.size(); i++){
        int day = 0;
        day = 100 - progresses[i];
        
        if (day % speeds[i] == 0){
            day = day/speeds[i];
        } else {
            day = day/speeds[i] + 1;
        }
        
        q.push(day);
    }
    
    while (!q.empty()){
        int front = q.front();
        q.pop();
        int count = 1;
        
        while (!q.empty() && front >= q.front()){
            q.pop();
            count++;
        }

        answer.push_back(count);
    }
    
    return answer;
}

 

회고

문제만 읽었을 때는 어려워보였는데, 막상 푸니까 쉬운 문제였다

풀면 풀수록 점점 자신감이 생긴다!

레벨 2에게 고마워지는 순간이다

'PS > 프로그래머스' 카테고리의 다른 글

[PS] 프로세스  (0) 2025.07.02
[PS] K번째수  (1) 2025.07.01
[PS] 올바른 괄호  (1) 2025.06.29
[PS] 같은 숫자는 싫어  (0) 2025.06.29
[PS] 의상  (0) 2025.06.24