프로그래머스 LV2 - 기능 개발

이은엽·2023년 10월 15일
0

algorithm

목록 보기
7/7

문제설명

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

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

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

제한 사항

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

입출력 예

문제풀이

  • speeds를 통해 progresses가 100이 되려면 얼마나 걸리는지 계산한다.
  • progresses부터 큰 수가 먼저 나오고 그 다음에 작은 수가 나오게 된다면 갯수를 1씩 더해간다.
  • progresses에서 지정한 하나의 수 보다 더 큰 수가 나오게 된다면 지금까지 더해온 숫자를 answer에 저장하고 새롭게 진행한다.

풀이 방법

  • 갯수에 따라 반환 길이가 달라지므로 Array를 사용하지 않고 List로 answer값 지정
  • result를 통해서 처음부터 끝까지 하나씩 비교를 하므로 queue를 사용
  • for문을 돌면서 각 progresses가 100이 되려면 몇일이 필요한지 계산한다.
  • 계산한 값을 queue에 offer
  • 첫번째 값을 poll한다.
  • 그 값이 다음 값보다 크면 cnt를 1씩더한다.
  • 만약 그 값이 다음값보다 작으면 answer에 현재 cnt를 저장하고 비교 값을 바꿔버린다.
  • 그 후 cnt는 다시 1로 지정
  • 계속하면서 result(queue)가 empty가 되어버린다면 while문을 탈출한다.
  • answer를 return한다.

풀이

import java.util.*;
class Solution {
    public List solution(int[] progresses, int[] speeds) {
        List<Integer> answer = new ArrayList<>();
        Queue<Integer> result = new LinkedList<>();
        for(int i = 0; i < progresses.length; i++){
            int rest = 100 - progresses[i];
            int date = rest / speeds[i];
            if(rest % speeds[i] != 0){
                date += 1;
            }
            result.offer(date);
        }
        int first = result.poll();
        int cnt = 1;
        while(!result.isEmpty()){
            int com = result.poll();
            if(first < com){
                answer.add(cnt);
                first = com;
                cnt = 1;
            }else{
                cnt++;
            }
        }
        answer.add(cnt);
        return answer;
    }
}

배운점

  • 오늘 pccp를 풀었는데 lv2 같은 구현을 풀었는데 생각보다 오래걸려서 아직 실력이 부족하다는 생각을 많이 했다...
  • 이와 같은 문제를 풀 때, 한번 생각을 정리하고 푸는 법을 조금 더 익숙해지도록 하자
  • 구현 문제는 효율성도 중요하지만 어떤 방식으로 가볍게 풀 수 있는지 매우 중요한것 같다.

문제풀이 주소

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

0개의 댓글