본문 바로가기
코딩 테스트/[JAVA] programmers 코딩 테스트 연습

[Programmers/JAVA] 기능개발 / 프로그래머스 코딩 테스트 연습

by M개발자 2022. 6. 28.
반응형

기능개발


문제 설명

 

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

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

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


예시

 

progresses speeds return
[93, 30, 55] [1, 30, 5] [2, 1]
[95, 90, 99, 99, 80, 99] [1, 1, 1, 1, 1, 1] [1, 3, 2]

코드 해석 및 전체 코드

 

첫번째 풀이 

 

1. 첫번째 기능 개발의 날짜를 구한다.(=day)

다음 기능 개발의 날짜와 비교하기 위해 기준이 되는 첫번째 기능 개발의 날짜를 구한 후 시작한다.

예) progresses[0] = 30
예) speeds[0] = 30

int day = (100 - progresses[0]) / speeds[0];
→ (100 - 30) / 30 = 2
if((100 - progresses[0]) % speeds[0] != 0) day++;
→ (100 - 30) % 30(= 10) != 0
→ day++ = 3

예의 경우 기능 개발을 3일간 개발해야 한다. 따라서 speed로 나누었을 때의 나머지가 0이 아닐 경우 하루를 더해줘야 한다.

 

2-1. 첫번째 기능을 제외한 남은 기능만큼 for문 반복 (1 ~ progresses.length)

 

2-2. 현재 기능 개발 날짜 구하기(= workingDay)

 

2-3. workingDay가 day보다 클 경우

0번째가 배포되지 않은 상태고 

1번째 기능 개발날짜가 0번째보다 클 경우에는

함께 배포하지 못하므로 

1차 배포에는 0번째만 가능하므로 반환 배열인 list에 cnt값을 넣어준다. 

이때 cnt는 배포 가능한 기능 수이다.

 

2-4. workingDay가 day보다 작거나 같을 경우

0번째가 배포되지 않은 상태고

1번째 기능 개발 날짜가 0번째와 같거나 작을 경우

함께 배포가 가능하다.

그러므로 n번째 배포 가능한 기능 수를 저장하는 cnt의 값을 1 증가 시킨다. 

 

3. for문이 마무리 되고 cnt의 값이 1일 경우

즉 마지막 cnt는 추가적으로 반환 list에 넣어주어야 한다. 그래서 for문이 끝나고 list.add(cnt)를 해준다. 

 

import java.util.ArrayList;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        ArrayList<Integer> list = new ArrayList<>();
        int cnt = 1;
        
        int day = (100 - progresses[0]) / speeds[0];
        if((100 - progresses[0]) % speeds[0] != 0) day++;
        
        for(int i = 1; i < progresses.length; i++){
            int workingDay = (100 - progresses[i]) / speeds[i];
            if((100 - progresses[i]) % speeds[i] != 0) workingDay++;
            
            if(workingDay > day) {
                list.add(cnt);
                cnt = 1;
                day = workingDay;
            }
            else 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;
    }
}

 

두번째 풀이 | queue

 

문제 주제가 스택/큐라서 큐로 다시 풀어보았다.

 

1. 각 기능의 개발 날짜를 queue에 저장한다.

 

2-1. queue가 비었있지 않을 때까지 while문을 반복한다.

 

2-2. n차 배포의 기준이 되는 기능의 개발 날짜를 꺼낸다.

int day = queue.poll();

 

2-2-1. n차에 배포될 수 있는 기능의 수를 구한다. 

// queue가 비어있지 않고, queue의 첫번째 값이 day보다 작거나 같을 경우 반복
while(!queue.isEmpty() && queue.peek() <= day) { 
   queue.poll(); // 첫번째 값 꺼내기
   cnt++; // 배포 기능 수 증가
}
list.add(cnt); // 배포 가능한 기능 수 반환 list에 추가하기

 

queue.poll()

poll 메소드는 queue의 첫번째 값을 꺼내고 반환한다.

 

queue.peek()

peek 메소드는 queue의 첫번째 값을 단순히 참조한다. 

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue; 

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        ArrayList<Integer> list = new ArrayList<>();
        Queue<Integer> queue = new LinkedList<>();
        
        for(int i = 0; i < progresses.length; i++){
            int workingDay = (100 - progresses[i]) / speeds[i];
            if((100 - progresses[i]) % speeds[i] != 0) workingDay++;
            queue.add(workingDay);
        }

        while(!queue.isEmpty()){
            int cnt = 1;
            int day = queue.poll();
        
            while(!queue.isEmpty() && queue.peek() <= day){
                queue.poll();
                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;
    }
}

 


github

programmers

 

반응형

댓글