[프로그래머스][Java] 기능개발 (Lv.2) - 스택/큐

박현아·2024년 11월 9일
0

programmers-java

목록 보기
31/35

👩‍💻 문제

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

🙋‍♀️ 답변

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        
        // 결과 저장할 List (가변 길이 필요)
        List<Integer> list = new ArrayList<>();
        
        // 작업 남은 일수 계산 (큐 : 선입선출)
        Queue<Integer> queue = new LinkedList<>(); // 7, 3, 9
        
        // 큐에 (남은 % (100 - 진행%) / 하루에 가능한 작업량) 해서 남은 일수 넣어주기
        for (int i=0; i<progresses.length; i++) {
            queue.offer((int)Math.ceil((100.0 - progresses[i]) / speeds[i]));
        }
        
        while (!queue.isEmpty()) { // queue가 비어있지 않다면
            int first = queue.poll(); // 맨 처음꺼 하나 꺼내기
            int count = 1;
            
            // 큐가 비어있지 않고, 이전에 꺼낸 것 보다 남은 일수가 적다면
            while (!queue.isEmpty() && queue.peek() <= first) {
                queue.poll(); // 그 다음꺼 꺼내기
                count++;
            }
            
            list.add(count); // 큐가 비었거나, 남은 일수가 크면 list에 카운트 추가
        }
        
        // 결과 list를 배열로 변환하여 리턴
        return list.stream().mapToInt(i->i).toArray();
    }
}

🤔

먼저 들어간 게 먼저 나가야되기 때문에 First in First out (FIFO)인 큐를 썼다.

for (int i=0; i<progresses.length; i++) {
	queue.offer((int)Math.ceil((100.0 - progresses[i]) / speeds[i]));
}

이 부분에서 처음에 100 으로 넣었더니 테스트 케이스 하나에서 실패가 떴다. "Math.ceil() 메서드는 실수 값을 받아들여서 올림 계산을 하기 때문에, 이때 실수형으로 처리해야 정확한 결과를 얻을 수 있습니다." 라고 챗지피티가 그랬다. 저번 코테 때에도 double로 안 풀어서 열심히 겨우 하나 푼 거 틀렸는데 !!! 🥹
100%에서 진행된 %를 빼고, 하루에 작업 가능한 속도로 나눠서 남은 작업 일수를 계산해준다.

list.stream().mapToInt(i->i).toArray();

리스트를 배열로 변환하는 것도 익숙하지 않은데,,, 많이 연습해야겠다. 이게 기억이 안 난다면 일일이 뽑아서 넣어주는 방법도 있다.

// 결과 list를 배열로 변환하여 리턴
int[] result = new int[list.size()];
        
for (int i=0; i<list.size(); i++) {
	result[i] = list.get(i);
}
        
return result;

0개의 댓글