본문 바로가기
Algorithm/Programmers

[프로그래머스]Level2 기능개발 <java>

by 수짱수짱 2022. 2. 18.

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

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

 

내가 짠 코드 (.java)

 

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        int count = 1;
        int cur = 0;
        
        List<Integer> days = new ArrayList<>();
        List<Integer> answers = new ArrayList<>();
        
        for (int i = 0; i <progresses.length; i++) {
            int day = 0;
            int num = 100 - progresses[i];
            
            if(num % speeds[i] != 0){
                day = (100-progresses[i]) / speeds[i];
                day += 1;
            }
            else{
                day = (100-progresses[i]) / speeds[i];
            }
            
            days.add(day);
            //System.out.println(day);
        }
        
              for (int i = 0; i < days.size()-1 ; i++) {
            
            if(days.get(i+1)>days.get(cur)){
                answers.add(count);
                count = 1;
                cur = i+1;
                //continue;
            }
            else count += 1;

            if(i+1==days.size()-1) answers.add(count);

        }
        answer = answers.stream().mapToInt(i->i).toArray();
        return answer;
    }
}

 

설명

 

 

해당 코드는 진도와 개발 속도를 계산하여 해당 진도를 100%로 완료하기 위해서 걸리는 시간을 계산한 것입니다.

num과 개발 속도의 나머지가 0으로 떨어지는 경우 하루 더 셀 필요가 없으므로 그대로 몫 값을 day로 설정합니다.

 

그러나 나머지가 남는 경우는 하루 더 셀 필요가 있습니다.

예를 들어, 개발 진행 속도는 32퍼센트이고 개발 속도는 3인경우 num은 68이 되겠고 num에서 개발 속도 3을 나눈 몫(68/3=22)은 22가 되겠습니다. 그러나 3*22는 68일보다 적습니다. 그러므로 하루가 더 필요한 것이죠.

그렇기 때문에 나머지가 0으로 떨어지지 않는 경우 day를 하루 더 증가시켜주었습니다.

 

 

 

해당 코드는 남은 날짜를 계산한 리스트를 가지고 하루에 몇개의 기능이 배포될 수 있는지 계산하는 코드입니다.

cur 변수는 현재 위치를 가르치며 현재 값보다 오래 걸리는 기간이 나온다면 현재 위치를 해당 위치로 바꾸어 줍니다.

 

continue를 주석처리 한 이유는 38번째 명령문을 마지막 i+1이 continue때문에 그냥 다음 반복으로 넘어가 마지막 day를 count하지 않는 경우가 생겨 주석처리 하였습니다. 만약에 i+1가 20이면서 마지막 인덱스이고 cur이 1이라면 현재 count를 answers에 넣어주고 38번째 if문으로 돌아가 마지막 count = 1 도 answers에 넣어주어야 합니다.

 

i+1이므로 i의 반복 범위는 size-1로 해주었습니다. (인덱스예외방지)

 

 

해당 코드는 ArrayList를 배열 형태로 바꿔주는 람다식입니다.

stream()은 해당 ArrayList의 모든 원소를 다 꺼냅니다. mapToInt를 통해 Integer값을 int형으로 변경시켜줍니다. 마지막에 toArray()를 통해 stream을 배열로 변경시켜줍니다.

 

해당 방법을 채택한 이유는 모든 원소를 복사해 옮기는 방법보다 다른 방법을 사용해보고 싶었습니다. 

 


 

위의 코드는 오류가 있을 수 있으며 해당 오류를 공유해주신다면 감사하겠습니다.

긴 글 봐주셔서 감사합니다. 오늘도 열공하세요 ^^