[Coding Test] 프로그래머스 JAVA 기능개발 - 큐

LeeSeungEun·2023년 5월 9일
0

Coding Test

목록 보기
4/38

1. 문제

2. 코드

  • 풀이 1
import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        List<Integer> answer = new ArrayList<>(); // 정답을 담을 리스트 생성
        int n = progresses.length;
        int[] days = new int[n]; // 작업 완료에 필요한 날짜를 담을 배열 생성

        // 작업 완료에 필요한 날짜 계산
        for (int i = 0; i < n; i++) {
            days[i] = (100 - progresses[i]) % speeds[i] == 0 ? (100 - progresses[i]) / speeds[i] : (100 - progresses[i]) / speeds[i] + 1;
        }

        int i = 0;
        while (i < n) {
            int cnt = 0; // 배포되는 작업의 수를 카운트합니다.
            int maxDay = days[i]; // 현재까지의 최대 배포일을 저장합니다.

            // 현재 작업 이후의 작업들을 검사합니다.
            while (i < n && days[i] <= maxDay) {
                cnt++; // 현재 배포될 작업의 수를 증가시킵니다.
                i++; // 다음 작업을 검사하기 위해 인덱스를 증가시킵니다.
            }

            answer.add(cnt); // 배포할 작업들의 수를 리스트에 추가합니다.
        }

        // 리스트를 배열로 변환합니다.
        int[] result = new int[answer.size()];
        for (int j = 0; j < answer.size(); j++) {
            result[j] = answer.get(j);
        }
        return result;
    }
}
  • 풀이 2
import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Queue<Integer> q = new LinkedList<>();
        int n = progresses.length;
        
        // 각 작업의 배포 날짜 계산
        for (int i = 0; i < n; i++) {
            int days = (int) Math.ceil((double)(100 - progresses[i]) / speeds[i]);
            q.offer(days);
        }
        
        // 각 배포마다 몇 개의 작업이 배포되는지 계산
        List<Integer> answerList = new ArrayList<>();
        int cnt = 1;
        int prev = q.poll();
        while (!q.isEmpty()) {
            int cur = q.poll();
            if (prev >= cur) {
                cnt++;
            } else {
                answerList.add(cnt);
                cnt = 1;
                prev = cur;
            }
        }
        answerList.add(cnt);
        
        // List를 int 배열로 변환하여 반환
        int[] answer = new int[answerList.size()];
        for (int i = 0; i < answerList.size(); i++) {
            answer[i] = answerList.get(i);
        }
        return answer;
    }
}

3. 풀이

  • 문제에 맞게 큐를 이용하였으나, while문이 익숙하지 않아 for와 if만 사용하다보니 코드 작성 완료에 실패하였다. (아래코드참조)
  • while문 사용에 좀 더 익숙해져야 할 것 같다.
java.util.Deque;
import java.util.LinkedList;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Deque deque = new LinkedList();

        for (int i = 0; i < progresses.length; i++) {
            deque.offer(progresses[i]);
        }
        int Cnt = 0;
        int[] day = new int[progresses.length];
        int[] answer = new int[progresses.length];
        for (int i = 0; i < progresses.length; i++) {
            int remain = (100 - progresses[i]) % speeds[i];
            int value = (100 - progresses[i]) / speeds[i];
            if (remain == 0) {
                day[i] = value;
            } else {
                day[i] = value + 1;
            }
        }
        for (int i = 0; i < progresses.length; i++) {
            if (day[i] < day[i + 1]) {
                deque.poll();
                day[i + 1] = day[i + 1] - day[i];
                Cnt = day[i];
                break;
            } else if (day[i] > day[i + 1]) {
            

        }

        return answer;
    }
}

4. 링크

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

0개의 댓글