이끌든지 따르든지 비키든지

Today I Learned/프로그래머스

[프로그래머스] 기능 개발 문제 - JAVA

SeongHo5 2023. 9. 20. 22:42

프로그래머스 코딩 테스트 연습 문제 -  기능 개발 / JAVA 풀이 정리

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

 

프로그래머스

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

programmers.co.kr

 


풀이 방법

이 문제는 각 기능이 배포될 때마다 몇 개의 기능이 배포되는지를 구하는 문제이다.

각 기능별 작업 진도와 작업 속도를 이용하여 배포일을 계산하고, 배포일에 배포되는 기능 수를 구하면 된다.


기능별별 배포일 계산

  • 작업 진도(progress)와 작업 속도(speed)를 이용하여 각 기능의 배포일을 계산
  • 배포일 = (100 - 작업 진도) / 작업 속도)

 

배포일마다 배포될 기능 수 계산

  • 배포일이 이전 배포일보다 크다면, 배포되는 기능 수를 1로 초기화하고 이를 결과에 추가
  • 배포일이 이전 배포일보다 작거나 같다면, 이전 배포에서 계산한 배포되는 기능 수에 1을 더하기
  • 최종적으로 구한 배포되는 기능 수를 반환

내가 작성한 코드

선언부와 작업별 남은 개발일 계산 코드

import java.util.ArrayList;
import java.util.Stack;

public class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Stack<Integer> dayStack = new Stack<>();
        ArrayList<Integer> answerList = new ArrayList<>();

        // 각 작업별로 배포까지 남은 개발일 계산(올림 처리)해서 Stack에 저장
        for (int i = progresses.length - 1; i >= 0; i--) {
            int remainingDays = (int) Math.ceil((double) (100 - progresses[i]) / speeds[i]);
            dayStack.push(remainingDays);
        }

// 이후 코드

 

ArrayList와 Stack을 사용할 것이기 때문에 import 해준다.

작업 완료일을 계산할 때 역순 순회를 했는데, 조건이 "앞에 있는 작업이 끝나야 뒤 쪽 작업을 배포할 수 있다"였으므로 역순 순회로 계산하는 것이 효율적이다.


배포일마다 배포될 기능 계산 코드

// 윗부분 코드
        while (!dayStack.isEmpty()) {
            int count = 1;
            int top = dayStack.pop();
            
            while (!dayStack.isEmpty() && top >= dayStack.peek()) {	
                dayStack.pop();
                count++;
            }
            answerList.add(count);
        }

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

        return answer;
    }

Stack에서 기능별 남은 작업일 값을 하나씩 pop해 값을 비교해준다.

 

while문 코드 설명
첫번째 기능의 남은 작업일이 두번째 기능의 남은 작업일보다 더 크다.
→ 첫번째 기능보다 두번째 기능이 먼저 완성된다. → 첫 배포일(첫 번째 기능이 배포되는 날)에 함께 배포된다.

 

이 방식으로 스택의 마지막 값까지 비교해 List에 담는다.

이 List값으로 결과 배열을 생성해 return한다. 끄읕