[Programmers][Java] 기능개발

HyeBin, Park·2021년 5월 3일
0

Programmers

목록 보기
8/26
post-thumbnail

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

📒 문제


📒 제한 사항


🌻 코드(스택 사용 x)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
         int cnt = 1;
        int[] day = new int[progresses.length]; 
        // 개발에 필요한 날짜 계산
        for(int i = 0 ;i<progresses.length;i++){
            if((100-progresses[i])%speeds[i]>0) day[i]=(100-progresses[i])/speeds[i]+1;
            else day[i] = (100-progresses[i])/speeds[i];
        }
        // 개발한 기능의 수 list 
        List<Integer> list = new ArrayList<>();
        for(int i = 0;i<day.length; i+=cnt ) {
            cnt = 1;
            for(int k =i+1;k<day.length;k++) {
            // 앞의 작업 개발기간 >= 뒤의 작업 개발기간
                if (day[i] >= day[k]) {
                    cnt++;
                }
                // 앞의 작업 개발기간 < 뒤의 작업 개발기간 
                else if(day[i]<day[k]) break;
          
            }
            list.add(cnt);
        }

        int answer[] = new int[list.size()];
        for(int i = 0;i<list.size();i++){
            answer[i]= list.get(i);
        }
        return answer;
    }
}

🌻 코드(스택 사용 O)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
  
         Stack <Integer> day = new Stack();
         //stack에 개발 날짜 넣어주기 (스택과 배열은 거꾸로 !) 
        for(int i = progresses.length-1 ;i>=0;i--){
            if((100-progresses[i])%speeds[i]>0) day.push((100-progresses[i])/speeds[i]+1);
            else day.push((100-progresses[i])/speeds[i]) ;
        }
        List<Integer> list = new ArrayList<>();
        while(!day.isEmpty()){
            int cnt = 1;
            int first = day.pop();
            //first가 더 크거나 같다면
            while (!day.isEmpty() && first>=day.peek()){
                day.pop();
                cnt++;
            }
            list.add(cnt);
        }

        int answer[] = new int[list.size()];
        for(int i = 0;i<list.size();i++){
            answer[i]= list.get(i);
        }
        return answer;
    }
}

💡 정리하기

👉 스택문제이지만 처음에는 스택을 사용하지않고 리스트로 풀었다. 스택또한 원리는 같아서 잘 활용할 수 있었다. 처음에 개발기간 값을 구하고 비교하면서 배포하는 기능의 수(cnt)를 증가시켜준다.

0개의 댓글