소소한 개발이야기

[Programmers 문제풀이 JAVA] Level 2 기능개발 본문

Programmers

[Programmers 문제풀이 JAVA] Level 2 기능개발

plplim 2019. 5. 29. 15:15

 

📄 기능개발

🔗 문제 풀러가기


문제의 조건을 살펴보면 모든 작업은 동시에 개발 됩니다. 하지만 이전의 작업이 마무리 되지 않으면 현재 작업은 이전의 작업이 마칠때 까지 기다려야 합니다. 즉, 모든 작업은 순서대로 이루어 진다고 볼 수 있습니다. 따라서 모든 작업을 Queue에 넣고 Queue의 가장 첫 번째 작업이 끝났다면 Queue에서 제거 한 뒤 다음 작업들 중 동시에 끝낼 수 있는 작업도 같이 Queue에서 제거해주면 됩니다. 문제 풀이 접근 순서는 다음과 같습니다.

  1. 작업의 정보(현재 진행률, 진행속도)를 Queue에 넣는다.
  2. Queue가 비기 전까지(모든 작업이 끝날 때까지) 작업들을 진행 시킨다.
  3. 만약 Queue의 가장 첫 번째 작업(선행작업)이 종료 되었다면 Queue에서 제거한다.
  4. 선행작업 이후 같이 종료될 수 있는 작업들을 확인해 Queue에서 제거한다.
  5. 동시에 끝낼 수 있는 작업의 개수를 기록한다. (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 문제 풀이

BaekJoon Online Judge 문제 풀이

Comments