programmers.co.kr/learn/courses/30/lessons/42586
1. 서론
쉬워 보이는데 쉬운 문제 ㅎㅎ 어렵게 생각 말 것.
2. 문제 풀이
여러 기능들을 개발하는데 각 기능들마다 하루에 할 수 있는 작업량이 다르다. 각 기능에는 순서가 있고, 그 순서대로 완료되는 날 배포한다. 만약 뒤의 기능이 먼저 완료한다고 해도 앞의 기능이 완료되는 날 같이 배포해야 한다. 각 배포 때마다 몇 개의 기능이 배포되는지를 배열로 return 하는 게 문제다.
문제에서 각 기능의 완성된 정도와 걸리는 시간을 문제에서 준다. 나는 완성된 정도에 걸리는 시간을 100이 될 때까지 더해줬다. 그리고 더하는 동안에 몇 번을 더해야 100이 되는지 count 해줬다. 그리고 그 count 해준 값을 큐에 넣었다. 그럼 큐에 기능 순서대로 며칠이 걸리는지 쌓이게 된다. 앞의 기능이 완성되어야 뒤를 배포할 수 있다는 것은 선입선출을 의미하므로 편하게 큐를 썼다.
그리고 반복문을 돌리며 큐를 pop 하는데 맨 앞의 값은 미리 다른 변수에 저장하고 pop한 후에 뒤의 값들과 비교하며 걸린 날짜가 작거나 같은 경우는 count를 해주다가 맨 앞의 값보다 큰 날이 나타나면 변수에 그 값을 저장하고 답을 저장하는 배열에 넣어준다.
문제의 입출력 예로 예시를 들자면
95, 90, 99, 99, 80, 99 <-> 1, 1, 1, 1, 1, 1
큐: 5 | 10, 1, 1 | 20, 1
배열: 1 3 2
이런 식으로 간단하게 풀 수 있다!!
3. 코드 설명
#include <queue>
#include <vector>
using namespace std;
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
queue<int> check;
int i, c, t;
for (i = 0; i < progresses.size(); i++)
{
c = 0;
while(progresses[i] < 100)
{
progresses[i] += speeds[i];
c++;
}
check.push(c);
}
c = 1;
t = check.front();
check.pop();
while(!check.empty())
{
if (t >= check.front())
c++;
else
{
answer.push_back(c);
c = 1;
t = check.front();
}
check.pop();
}
answer.push_back(c);
return answer;
}
progresses를 한 바퀴 돌면서 안의 반복문을 따로 돌려 전부 작업이 완료되게 해준다.
작업을 완료하게 speeds 배열의 값을 넣어주는 동안에 며칠이 걸리는지 c로 count 한다.
카운트 한 값을 check 큐에 넣는다.
t에는 가장 큰 값이 들어가도록 하는데 초기 값은 맨 앞의 값이다. 맨 앞의 값을 넣어주고 그 값은 pop 한다.
그리고 큐를 돌면서 큐의 가장 앞의 값이 t보다 작거나 같으면 그 값을 count 하고 아닌 경우에는 답을 적는 answer 배열에 넣어주고 c와 t를 초기화한다.
그리고 마지막에 남은 count 값을 answer 배열에 마저 넣어준다.
'Algorithm' 카테고리의 다른 글
[C++] 백준 2920 음계 (0) | 2021.02.08 |
---|---|
[C++] 프로그래머스 주식가격 (0) | 2021.02.06 |
[C++] 프로그래머스 다리를 지나는 트럭 (0) | 2021.02.04 |
[C++] 프로그래머스 프린터 (0) | 2021.02.03 |
[C++] 프로그래머스 124 나라의 숫자 (0) | 2021.01.24 |