기능개발

기능개발

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;
}