코딩 테스트/자료구조

[프로그래머스] 42586 기능개발(Lv2) - 배열(스택, 큐)

토자맨 2024. 6. 28. 23:32

문제

입출력 예시

코드

  1. (100 - progresses[i]) / speeds[i] (100 - progresses[i]) % speeds[i]를 이용하여 작업 시간을 구한다.
  2. 현재 작업의 종료 시간 >= 다음 작업의 종료 시간이라면 다음 작업을 대기시켰다 현재 작업 배포 시기에 함께 배포해야 하므로 배포되는 기능의 개수인 cnt++
  3. 2에서 현재 작업 시간에 배포되는 기능의 개수를 모두 구했다면 answer 리스트에add()
  4. answer 리스트 반환
import java.util.ArrayList;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {

		// 1. ---------------------------------------------------------
        // 작업 기간(end) 계산
        int[] end = new int[progresses.length];
        for (int i = 0; i < progresses.length; i++) {
            int intg = (100 - progresses[i]) / speeds[i];
            float flt = (100 - progresses[i]) % speeds[i];

            // 각 작업의 완료 기간 설정
            if (flt == 0) {
                end[i] = intg;
            }
            else {
                end[i] = intg+1;
            }
        }
        
		// 2. ---------------------------------------------------------
        // 기능 배포 개수 계산
        ArrayList<Integer> answer = new ArrayList<>();
        int front = 0;
        while (front < end.length) {
            int cnt = 1;
            /**
            if, 비교 대상 < 배열 크기 && 앞 > 비교 대상
            then, 배포 개수++(자기 자신 + 비교 대상)
            **/

            // 이 부분 for로 했는데 막혀서 gpt 참조함
            // for 반복문 + if 조건문보단 while로 반복과 조건 한번에 하는 게 적절
            while (front + cnt < end.length && end[front] >= end[front + cnt]) {
                cnt++;
            }
            /**
            if, 비교 대상이 더 크다면
            then,
            지금까지 센 cnt를 answer에 삽입
            &&
            자기 자신을 비교 대상으로 전환
            **/
            // 3. ---------------------------------------------------------
            answer.add(cnt);
            front += cnt;
        }

        // 출력을 위해 ArrayList<Integer>를 int[]로 변환
        int[] result = new int[answer.size()];
        for (int j = 0; j < answer.size(); j++) {
            result[j] = answer.get(j);
        }

        return result;
    }
}

결론

스택/큐 문제지만 배열을 이용하여 간단하게 풀 수 있어서 배열을 이용해 풀어봤다.