Recent Posts
소소한 개발이야기
[Programmers 문제풀이 JAVA] Level 2 기능개발 본문
📄 기능개발
🔗 문제 풀러가기
문제의 조건을 살펴보면 모든 작업은 동시에 개발 됩니다. 하지만 이전의 작업이 마무리 되지 않으면 현재 작업은 이전의 작업이 마칠때 까지 기다려야 합니다. 즉, 모든 작업은 순서대로 이루어 진다고 볼 수 있습니다. 따라서 모든 작업을 Queue에 넣고 Queue의 가장 첫 번째 작업이 끝났다면 Queue에서 제거 한 뒤 다음 작업들 중 동시에 끝낼 수 있는 작업도 같이 Queue에서 제거해주면 됩니다. 문제 풀이 접근 순서는 다음과 같습니다.
- 작업의 정보(현재 진행률, 진행속도)를 Queue에 넣는다.
- Queue가 비기 전까지(모든 작업이 끝날 때까지) 작업들을 진행 시킨다.
- 만약 Queue의 가장 첫 번째 작업(선행작업)이 종료 되었다면 Queue에서 제거한다.
- 선행작업 이후 같이 종료될 수 있는 작업들을 확인해 Queue에서 제거한다.
- 동시에 끝낼 수 있는 작업의 개수를 기록한다. (QueueSize를 이용)
마지막 동시에 끝낼 수 있는 작업의 개수를 세는 방법은 작업이 끝났는지 여부를 확인하기 전 Queue에 들어 있는 작업의 개수를 세어줍니다. 이 후 Queue에 들어 있는 작업의 개수의 변화가 생겼다면(개수가 줄었다면) 종료된 작업이 있다는 의미이므로 이전에 세어준 작업의 개수 - 현재 남은 작업의 개수가 동시에 끝낼 수 있는 작업의 개수 입니다.
글보단 소스코드를 보면 쉽게 이해할 수 있습니다.
🌱 Solution 함수
public int[] solution(int[] progresses, int[] speeds) {
List<Integer> resultList = new ArrayList<>();
Queue<Develop> processQueue = new LinkedList<>();
for (int i = 0; i < progresses.length; i++) {
processQueue.add(new Process(progresses[i], speeds[i]));
}
while (!processQueue.isEmpty()) {
processQueue.forEach(Develop::doWork);
int preQueueSize = processQueue.size();
while (!processQueue.isEmpty() && processQueue.peek().isComplete()) {
processQueue.poll();
}
int nextQueueSize = processQueue.size();
if (preQueueSize > nextQueueSize) resultList.add(preQueueSize - nextQueueSize);
}
return resultList.stream().mapToInt(Integer::intValue).toArray();
}
🌱 Process class
주어진 작업의 진행률
, 작업 속도
를 저장하는 클래스 입니다.
class Process implements Develop {
private int progressRate;
private int developSpeed;
public Process(int progressRate, int developSpeed) {
this.progressRate = progressRate;
this.developSpeed = developSpeed;
}
@Override
public void doWork() {
progressRate += developSpeed;
}
@Override
public boolean isComplete() {
return progressRate >= 100;
}
}
interface Develop {
void doWork();
boolean isComplete();
}
💡 Github에 더 많은 문제 풀이가 있습니다.
'Programmers' 카테고리의 다른 글
[Programmers 문제풀이 JAVA] Level 2 더 맵게 (0) | 2019.05.30 |
---|---|
[Programmers 문제풀이 JAVA] Level 2 쇠막대기 (0) | 2019.05.29 |
[Programmers 문제풀이 JAVA] Level 2 다리를 지나는 트럭 (0) | 2019.05.28 |
[Programmers 문제풀이 JAVA] Level 2 소수 찾기 (0) | 2019.05.28 |
[Programmers 문제풀이 JAVA] Level 2 탑 (0) | 2019.05.27 |
Comments