알고리즘/알고리즘문풀

프로그래머스 코딩테스트 고득점 Kit - 기능개발 (JAVA)

developer-ellen 2022. 7. 8. 23:50

 문제 -프로그래머스 코딩테스트 고득점 Kit 기능개발 - JAVA 풀이법

출처 

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

 

프로그래머스

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

programmers.co.kr

 

 

 

📝 문제해결법

1. 스택 활용

  • 배포되어야 하는 순서를 반대로 각 기능 진도 100%가 되기 위해 며칠이 걸리는지를 stack에 push  해준다.
  • stack에서 하나씩 꺼내서 현재 기능을 배포할 때 걸리는 일수보다 작은 것이 뒤에 기능에 존재하는지를 체크하여 자신의 일수보다 작거나 같으면 같이 배포 하도록 구현한다.
  • 따라서 while문을 통해 현재 pop한 num보다 작거나 같은 스택의 top을 계속 체크하구 만약 같이 배포할 수 있을 경우 pop을 하며 count를 1증가시켜주면서 같은 시점에 배포할 기능을 카운트 해준다.

2. 느낀점

  • 스택/큐라는 분류를 봐서.. 이미 해결 알고리즘을 생각하고 구현하니깐 쉬운 부분이 있었다.
  • 스택이 이런 방식으로도 해결될 수 있구나... 

 

 

💻 소스코드 

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Stack<Integer> stack = new Stack<>();
        
        
        for(int i=progresses.length-1;i>=0;i--){
            int diff = 100 - progresses[i];
            if(diff%speeds[i] > 0){
                stack.push(diff/speeds[i] + 1);
            } else {
                stack.push(diff/speeds[i]);
            }
                
        }
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        while(!stack.isEmpty()){
            int count = 1;
            int num = stack.pop();
            //System.out.println("num "+num);
            while(!stack.isEmpty()){
                int num2 = stack.peek();
                //System.out.println("num2 "+num2);
                if(num < num2){
                    break;
                } else {
                    count++;
                    stack.pop();
                }
            }
            list.add(count);
        }
        
        int[] answer = new int[list.size()];
        
        for(int i=0;i<list.size();i++){
            answer[i] = list.get(i);
        }

        
        return answer;
    }
}