원하는 것은 뭐든지

99클럽 코테 스터디 8일차 TIL , 기능개발 본문

개발/문제풀이

99클럽 코테 스터디 8일차 TIL , 기능개발

댕로그😏 2024. 7. 29. 20:49
반응형

문제

 

현재 개발되어야 하는 기능의 공정률과 개발속도가 입력으로 들어온다.

각자 다른 개발자가 기능을 개발하기 때문에 동시에 개발되지만, 이전 기능이 개발되지 않으면 에러가 발생하기에 배포할 수 없다. 뒤의 기능이 개발이 완료되더라도 이전의 기능이 개발완료되지 않았으면 이전 기능이 개발완료 되는 시점에 함께 배포된다.

풀이

제출 1 - 오답

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        
        int processing = (100-progresses[0])/speeds[0];
        if((100-progresses[0])%speeds[0] != 0) processing += 1;
        int cnt = 1;
        
        List<Integer> list = new ArrayList<>();
        
        for(int i=1;i<speeds.length;i++){
            
            int progress = progresses[i];
            int speed = speeds[i];
            int processTime = (100-progress)/speed;
            if((100-progress)%speed != 0) processTime += 1;
            
            if(processing < processTime){
                processing = processTime;
                list.add(cnt);
                cnt = 1;
            }else if(processing == processTime){
                list.add(cnt+1);
                cnt = 0;
            }else{
                cnt ++;
            }
        }
        
        if(cnt != 0) list.add(cnt);  //마지막 값
        
        // int[] answer = list.toArray(new int[0]);
        int[] answer = new int[list.size()];
        for(int i = 0;i<list.size();i++){
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

 

큐를 사용해야 하나 했지만 그럴 필요 없이 일단 완료되는데 필요한 일 수를 구한 후에 앞에서 부터 뒤로 가면서 이전의 기능보다 늦게 끝나는 경우에 list에 담으면 된다고 생각했다. 그리고 같은 일수가 소모되는 기능을 만나면 해당 기능까지 추가하고 배포 기능을 0으로 초기화하도록 했다.

 

제출 2 - 정답

import java.util.*;
class Solution {
	
    //일 수 계산
    int calculateDays(int progress, int speed){
        int days = (100-progress)/speed;
        if((100-progress)%speed != 0) days+=1;
        
        return days;
    }
    public int[] solution(int[] progresses, int[] speeds) {
        
        int processing = calculateDays(progresses[0], speeds[0]);
        
        int cnt = 1;	//배포 기능 개수
        
        List<Integer> list = new ArrayList<>();
        
        for(int i=1;i<speeds.length;i++){
            
            int progress = progresses[i];
            int speed = speeds[i];
            int processTime = calculateDays(progress, speed);
            
            if(processing < processTime){	//이전에 최고 값보다 크면 true
                processing = processTime;
                list.add(cnt);
                cnt = 1;
            }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;
    }
}

 

소모되는 일 수가 같은 경우를 고려 할 필요가 없었다.

이렇게 되면 마지막 값을 더해 줄 경우도 조건절을 사용하지 않고 더해주면 된다.

 

TIL

  • 계속해서 문제를 해결하긴 하는데 시간이 많이 소요된다. 풀이시간을 줄이는데 힘을 써야 한다.
반응형
Comments