Algorithm/Programmers

[Lv.2] 기능개발 : Java

say! 2025. 7. 5. 06:43
728x90

 

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

2번째 풀이

import java.util.*;

class Solution {
    // 몇 개의 기능이 배포되는지 리턴
    static int[] progresses, speeds;
    static int day =0, cnt = 1, work =0, finished=0;
    static ArrayList<Integer> result;
    
    public int[] solution(int[] progresses, int[] speeds) {
        
        this.progresses = progresses;
        this.speeds = speeds;
        
        result = new ArrayList<>();
        for(int i=0; i<progresses.length; i++){
            work = 100 - progresses[i];
            int j = work / speeds[i];
            if(work % speeds[i] != 0){
                finished = j + 1;
            }
            else finished = j;
            
            if(day >= finished){
                cnt++;
            }
            else{
                if(day!= 0) result.add(cnt);
                cnt=1;
                day = finished;
            }
        }
        
        result.add(cnt);
        // 앞 기능의 날짜 day=0; 7 0
        // 100 - progresses[] > work 7  70 45
        // work / speeds[], work%speeds[] 나머지가 0이 아니면 +1해주기 > finished = 7 3 9
        // 앞에꺼 day가 더 큰 경우 ++ / day가 더 작은 경우 day = finished, array에 cnt 넣고 다시 1
        int[] answer = new int[result.size()];
        for(int i=0; i<result.size(); i++){
            answer[i] = result.get(i);
        }
        
        
        return answer;
    }
}

 

1번째 풀이

날짜 계산할 때 100말고 100.0 으로 해서 정수형 나눗셈 말고 double형 나눗셈 계산하도록 하기 

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        
        ArrayList<Integer> a = new ArrayList<>();
        int n = progresses.length;
        int day = (int)Math.ceil((100.0-progresses[0])/speeds[0]);
        int cnt = 1;
        for(int i=1; i<n; i++){
            int secondDay = (int)Math.ceil((100.0-progresses[i])/speeds[i]);
            
            if(day>= secondDay){
                cnt++;
            }
            else{
                a.add(cnt);
                cnt = 1;
                day = secondDay;
            }
        }
        
        a.add(cnt);
        
        int[] answer = new int[a.size()];
        for(int i=0; i<a.size();i++){
            answer[i] = a.get(i);
        }
        return answer;
    }
}

 

큐 버전

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        // 1) 각 기능 완료까지 필요한 '일' 계산(올림) → 큐에 저장
        Queue<Integer> q = new ArrayDeque<>();
        for (int i = 0; i < progresses.length; i++) {
            int remain = 100 - progresses[i];
            int days = (remain + speeds[i] - 1) / speeds[i]; // ceil
            q.offer(days);
        }

        // 2) 선행 기능 기준으로 같은 날에 배포 가능한 것들을 묶어서 카운트
        List<Integer> res = new ArrayList<>();
        while (!q.isEmpty()) {
            int current = q.poll(); // 현재 배포 묶음의 기준일
            int count = 1;

            // 다음 기능이 current 이내에 끝나면 같은 배포로 묶음
            while (!q.isEmpty() && q.peek() <= current) {
                q.poll();
                count++;
            }
            res.add(count);
        }

        // 3) List → int[]
        int[] answer = new int[res.size()];
        for (int i = 0; i < res.size(); i++) answer[i] = res.get(i);
        return answer;
    }
}

'Algorithm > Programmers' 카테고리의 다른 글

[Lv.2] 짝지어 제거하기 : Java  (0) 2025.09.26
조이스틱 : Java  (1) 2025.07.05
완주하지 못한 사람 : Java  (0) 2025.07.05
[Lv.2] 소수찾기 : Java  (0) 2025.07.05
[Lv.2] 피로도 : Java / DFS+백트래킹  (0) 2025.07.05