기능개발
2019, Jun 02
- https://programmers.co.kr/learn/courses/30/lessons/42586
- 남은 작업 시간 및 순차적인 작업 순서를 고려하여 작업의 쌍을 정하는 문제입니다.
- 먼저 전체 작업에 대하여
ceil( (100.0 - progresses[i]) / speeds[i])
를 통하여 남은 작업에 필요한 완료일을 구합니다. - 그리고 배열의 순서대로 작업을 그룹별로 배포해야 합니다.
- for 루프에서 전체 배열을 순회하면서 flag 라는 다른 인덱스 참조 변수를 둡니다.
- 아래 코드에서
v[flag] >= v[i]
인 경우에는 같은 그룹으로 묶을 수 있습니다. - 즉, 먼저 선행되어야 하는 작업이 뒤의 작업보다 늦게 끝나는 상태입니다.
- 아래 코드에서
- 아래 코드처럼 문제를 해결하면 O(N)의 복잡도로 문제를 해결할 수 있습니다.
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
vector<int> v(progresses.size());
for (int i = 0; i < progresses.size(); ++i) {
int n = ceil((100.0 - progresses[i]) / speeds[i]);
v[i] = n;
}
int cnt = 1;
int flag = 0;
for (int i = 1; i <= v.size(); ++i) {
if (i == v.size()) {
answer.push_back(cnt);
}
else if (v[flag] >= v[i]) {
cnt++;
}
else {
flag = i;
answer.push_back(cnt);
cnt = 1;
}
}
return answer;
}