본문 바로가기
Algorithm/프로그래머스

[프로그래머스]스택/큐 : 기능개발 (level 2) (c++)

by HBGB 2020. 4. 29.

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

 

프로그래머스

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

programmers.co.kr

 

 

방법 1: 문제에 주어진 그대로 구현. queue 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <string>
#include <vector>
#include <queue>
 
using namespace std;
 
vector<int> solution(vector<int> progresses, vector<int> speeds) {
 
    // queue에 모든 인덱스 넣기
    queue<int> q;
    for (int i = 0; i < progresses.size(); i++)
    {
        q.push(i);
    }
    
    vector<int> answer;
    int tobe = 0;
    while (!q.empty())
    {
        // 아직 배포안된 기능부터 작업 진행
        for (int i = tobe; i < progresses.size(); i++)
        {
            if (progresses[i] < 100)
            {
                progresses[i] += speeds[i];
            }
        }
 
        // 배포 다음순서 작업이 완료 되면
        if (progresses[tobe] >= 100)
        {
            // 완료 상태인 작업물 모두 배포 & 카운팅
            int cnt = 0;
            while (!q.empty() && progresses[q.front()] >= 100)
            {
                q.pop();
                cnt++;
            }
            tobe += cnt;
            answer.push_back(cnt);
        }
    }
    
    return answer;
}
Colored by Color Scripter

 

방법 2: 작업 완료 시간을 중심으로

(프로그래머스 sterilizedmilk님 풀이 참고)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
vector<int> solution(vector<int> progresses, vector<int> speeds) {
    
    vector<int> answer;
   
    int day;            // 작업 완료에 걸리는 시간
    int max_day = 0;    // 배포될때까지 기다려야 하는 시간
 
    // 앞에서부터 순차적으로 배포개수 카운팅
    for (int i = 0; i < progresses.size(); i++)
    {
        day = (99 - progresses[i]) / speeds[i] + 1;
 
        // 해당 기능의 작업시간이 이전 기능보다 더 오래걸릴 때
        if (day > max_day)
        {
            answer.push_back(1);
            max_day = day;
        }
        // 그렇지 않고, 이전 기능이 완료될 때까지 기다려야 할때
        else
        {
            answer.back()++;
        }
    }
 
    return answer;
}
Colored by Color Scripter

 

 

방법 2가 너무 갓갓이다

방법 1은 시간의 흐름마저도 너무 충실히 구현해버린 코드 ㅋㅋ

 

댓글