카테고리 없음

[알고리즘] 기능 개발

sandbackend 2023. 1. 23. 16:49

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

- 정해진 순서대로만 배포가 가능하기 때문에 현재 기능이 완료됐다고 하더라도 앞의 기능이 완료되지 않으면 배포가 불가능하다. 그렇기에 입력 순서대로 반환하는 Queue를 사용 했다.

 

 

- 기능구현이 완료되는 시간을 구해 Queue에 순차적으로 넣기 위해 값을 계산 했다. 

 

그런데 이렇게 하니 테스트 11에서 실패를 한다.

- 소수점자리까지 구해야한다. 만약 5.5와 같이 소수점이 나오게 되면 실제 배포일은 6일 이기 떄문에 Math.ceil을 통해 올림해주자. 

 

- Queue.poll()을 통해 현재 기능이 완료되는 일자를 꺼내오고 Queue를 차례대로 보며 현재 꺼내온 날짜에 이미 구현이 완료된기능들을 Queue에서 제거하며 개수를 증가시켜주었다. 현재 완료된 기능이 더 이상 없다면 List에 개수를 추가하고 다음 기능이 완료 되도록 반복문을 돌려주 었다.

 

완성코드

static class Solution {
    public int[] solution(int[] progresses, int[] speeds) {

        // 1.남은 작업 일 수를 저장할 큐
        Queue<Integer> queue = new LinkedList<>();
        for (int i=0; i<progresses.length; i++) {
            // 남은 작업일을 계산하여 큐에 추가
            queue.add((int)(Math.ceil((100.0-progresses[i]) / speeds[i])));
        }
        
        // 2. 현재 작업일과 다음 작업일을 비교
        List<Integer> arr = new ArrayList<>();
        while (!queue.isEmpty()) {
            int day = queue.poll();
            int cnt = 1;

            while (!queue.isEmpty() && day >= queue.peek()) {
                cnt++;
                queue.poll();
            }
            arr.add(cnt);
        }

        // 3. ArrayList를 배열로 변환
        int[] answer = new int[arr.size()];
        for (int i=0; i<answer.length; i++) {
            answer[i] = arr.get(i);
        }

        return answer;
    }
}