조앤의 기술블로그

[프로그래머스 / 스택&큐] 기능 개발(java) 본문

Programming/프로그래머스

[프로그래머스 / 스택&큐] 기능 개발(java)

쬬앤 2020. 3. 18. 12:09

[문제]

문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

제한 사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

입출력 예

progressesspeedsreturn

[93,30,55] [1,30,5] [2,1]

입출력 예 설명

첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다. 

따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.

 

[1차 실패 코드]

import java.util.*;
class Solution {
    static int getDate(int p, int s){
        int tmp = (100 - p) % s;
        if(tmp == 0)
            return (100 - p) / s;
        else
            return ((100 - p) / s) + 1;
    }
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        //stack
        int n = progresses.length;
        int[] date = new int[n];
        
        
        for(int i = 0; i < n; i++ ){
            date[i] = getDate(progresses[i], speeds[i]);
        }
        
        Stack<Integer> stack = new Stack<>();
        stack.add(1); //첫번째 작업
        for(int i=1; i<=n; i++){
            if(date[i-1] <= date[i])
                stack.add(1);
            else{
                int num = stack.pop();
                num += 1;
                stack.add(num);
            }
        }
        answer = new int[stack.size()];
        int i = 0;
        for(int d : stack){
            answer[i] = d;
           i++;
        }
        //List 를 쓰면 내가 고민했던 문제를 쉽게 해결할 수 있다. 
        //나랑 풀이 같은 것 같은데 왜 나는 틀리는거지.. 
        // 세심한 조건,예외 이런것이 문제...
        // 큰 접근 방식은 이제 어느정도 근접한것 같은데 그래도 정답은 아님..
        // 완벽하려면 완벽하게 생각해 철저하게.
        // 이것도 맞는 것 같은데 왜 틀리지 ㅜㅜ
        return answer;
    }
}

 

1차 실패 후 구글 참고

https://heedipro.tistory.com/232

 

프로그래머스_기능개발_스택/큐(java)

기능개발 1. 문제 https://programmers.co.kr/learn/courses/30/lessons/42586?language=java 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다...

heedipro.tistory.com

문제점은 이전 것이랑만 비교한다는 것이었음

테스트케이스 통과 갯수가 늘어나긴 했으나 

100% 통과는 아니었다. 

import java.util.*;
class Solution {
    static int getDate(int p, int s){
        int tmp = (100 - p) % s;
        if(tmp == 0)
            return (100 - p) / s;
        else
            return ((100 - p) / s) + 1;
    }
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        //stack
        int n = progresses.length;
        int[] date = new int[n];
        
        
        for(int i = 0; i < n; i++ ){
            date[i] = getDate(progresses[i], speeds[i]);
        }
        
        Stack<Integer> stack = new Stack<>();
        stack.add(1); //첫번째 작업
        int standard = date[0]; //추기
        for(int i=1; i<n; i++){
            if(standard <= date[i]){
                stack.add(1);
                standard = date[i];//추가
            }
            else{
                int num = stack.pop();
                num += 1;
                stack.add(num);
            }
        }
        answer = new int[stack.size()];
        int i = 0;
        for(int d : stack){
            answer[i] = d;
           i++;
        }
        
       
        return answer;
    }
}

 

[정답코드]

import java.util.*;
class Solution {
    static int getDate(int p, int s){
        int tmp = (100 - p) % s;
        if(tmp == 0)
            return (100 - p) / s;
        else
            return ((100 - p) / s) + 1;
    }
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        //stack
        int n = progresses.length;
        int[] date = new int[n];
        
        
        for(int i = 0; i < n; i++ ){
            date[i] = getDate(progresses[i], speeds[i]);
        }
        
        Stack<Integer> stack = new Stack<>();
        stack.add(1); //첫번째 작업
        int standard = date[0];
        for(int i=1; i<n; i++){
            if(standard < date[i]){
                stack.add(1);
                standard = date[i];
            }
            else{
                int num = stack.pop();
                num += 1;
                stack.add(num);
            }
        }
        answer = new int[stack.size()];
        int i = 0;
        for(int d : stack){
            answer[i] = d;
           i++;
        }
       
        return answer;
    }
}

비교할 때 등호가 문제였다!!!!!!!!!!!! 왹왹

 

[문제링크]

https://programmers.co.kr/learn/courses/30/parts/12081

 

프로그래머스

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

programmers.co.kr