[프로그래머스] 기능개발 - Java, 자바

Kim Ji Eun·2022년 3월 8일
1

난이도

레벨 2

문제

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

풀이

처음 이 문제를 풀었을 때 배열로 문제를 해결했는데 다시 풀다보니 큐로도 해결할 수 있어서 두가지 모두 풀이하겠다. (크게 다른 점은 없다.)

문제 풀이 순서
방법 1) 배열로 푸는 방법
1. 작업일 수 배열(works)을 구한다.
2. works를 for문을 돌린다.
3. 전에 나온게(x) 나중에 나온 것(works[i])보다 크거나 같으면 count를 증가,
아니면 count를 list에 추가, count를 1로 초기화, x=works[i] 처리
4. for문을 빠져나와서 마지막 처리 count를 리스트에 추가한다.
5. list를 출력한다.

방법 2) 큐로 푸는 방법
1. 작업일 수를 큐에 저장한다.
2. 큐가 빌 때까지 작업을 실행한다.
3. 전에 나온게(x) 나중에 나온 것(q.peek()) 보다 크거나 같으면 count 증가, q.poll(),
아니면 count를 리스트에 추가, count를 1로 초기화, x=q.poll()처리
4. while문을 빠져나와서 마지막 처리 count를 리스트에 추가한다.
5. list를 출력한다.

코드

방법 1) 배열로 푸는 방법

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {

        List<Integer> list = new ArrayList<>();
        int[] works = new int[progresses.length];
        
      
        for(int i = 0; i < speeds.length; i++){
            works[i]  = (100 - progresses[i]) / speeds[i];
            if ((100 - progresses[i]) % speeds[i] != 0){
                works[i]  += 1;
            }
        }
        
        int x = works[0];
        int count=1;
        for(int i=1;i<progresses.length;i++){

            if(x>=works[i]){
                count+=1;
            }else{
                list.add(count);
                count =1;
                x= works[i];
            }
        }
        list.add(count);
        
        int[] answer = new int[list.size()];

        for (int i = 0; i <list.size(); i++) {
            answer[i] = list.get(i);
        }

        return answer;
    }
}

방법 2) 큐로 푸는 방법


import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {

        ArrayList<Integer> list = new ArrayList<>();
        Queue<Integer> q = new LinkedList<>();

        for (int i = 0; i < progresses.length; i++) {
            if ((100 - progresses[i]) % speeds[i] == 0) {
                q.add((100 - progresses[i]) / speeds[i]);
            } else {
                q.add((100 - progresses[i]) / speeds[i] + 1);
            }
        }

        int x = q.poll();
        int count = 1;
        while (!q.isEmpty()) {
            if (x >= q.peek()) {
                count++;
                q.poll();
            } else {
                list.add(count);
                count = 1;
                x = q.poll();
            }
        }
        list.add(count);

        int[] answer = new int[list.size()];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = list.get(i);
        }


        return answer;
    }
}
profile
Back-End Developer

0개의 댓글