계단을 오르듯이

[JAVA] 기능 개발 본문

알고리즘/프로그래머스

[JAVA] 기능 개발

happyAyun 2022. 1. 7. 11:50

스택을 이용해 풀이하였다.

여기서 가장 중요했던 것!!!

Math.round() 는 long을 반환하므로 (int) Math.round()로 형변환을 해주어야 int형이 된다는 것.

두번째, Math.round()는 반올림!!!! 이 문제에서는 반올림이 아닌 0.1의 소수점이 존재해도 올림을 해주어야 하는 날짜 계산이기에 Math.ceil()을 이용해야 했다!!!

Math.ceil()은 무조건 올림이다.

날짜 계산은 100에서 작업완성도를 빼준 후 작업속도로 나누어 나머지가 발생하면 올림을 하여 날짜를 구하였다.

해당 일자가 현재 스택 안에 있는 날짜보다 크면 스택에 있는 작업을 빼주고, 같거나 작을 시 다시 스택에 넣어주었다.

스택에 들어있는 작업들은 모두 한번에 완성될 작업들을 의미한다.

마지막 스택은 날짜가 0이 아니라면 항상 있으므로 마지막 스택도 모두 처리해주어야 한다.

 

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        Stack<Integer> stack = new Stack<>();
        List<Integer> list = new ArrayList<>();
        int max = 0; // 자연수이므로 최소를 0으로
        for(int i=0;i<progresses.length;i++){
            int num = (int) Math.ceil((100 - progresses[i]) / (speeds[i]*1.0));
            if(stack.isEmpty()){ 
                if(max >= num){
                    list.add(1);
                }else{
                    stack.push(num);
                    max = num;
                }
            }else{
                if(max < num){ 
                    list.add(stack.size());
                    stack.clear();
                    max = num; // 다음 타자로 넘겨주기
                } 
                stack.push(num);
            }
        }
        // 마지막 스택빼내기
        if(!stack.isEmpty()){
            list.add(stack.size());
        }
        int size = list.size();
        answer = new int[size];
        for(int i=0;i<size;i++){
            answer[i] = list.get(i);
        }
        return answer;
    }
}

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[JAVA] 네트워크  (0) 2022.01.08
[JAVA] 타겟 넘버  (0) 2022.01.08
[JAVA] 소수 찾기(완전탐색)  (0) 2022.01.07
[JAVA] 가장 큰 수  (0) 2022.01.07
[JAVA] 위장  (0) 2022.01.07