알고리즘

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

ernest45 2024. 5. 22. 22:29

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1. 문제 해석

100%되면 사용 가능하고 각 기능마다 시간이 다 다르다.


그렇지만 배포는 앞에 완료해야 나올 수 있음


한번의 배포 시 몇개씩 배포 되는 지 return하기


먼저 queue로 해야할 듯 오랜만에 큐도 같이 구현해보자


queue로 만들고 완료된 상태일 때 갯수를 세면 될듯 ?  현재 작업량과 각 작업 별 스피드가 주어짐

 

 

progresses     speeds         return
[93, 30, 55]   [1, 30, 5]      [2, 1]
7일 째 2개 배포 9일째 1개 배포

 

 


(queue로만 만들면.. 93 에서 스피드를 계속 더해줘야 하는데 애매한데.. arrayList로도 충분히 구현 가능하지 않나?)

 

 

 

 

 

 

 

2.  내 풀이

 

먼저 queue로 풀려다 그 작업 량에 하루 작업량을 계속 더해주고 100되면 빼야 하는데 이러면 자료구조를 둘 다 써야 할 것 같아서

애매했다..

 

 

일단은 먼저 오랜만에 간단하게 queue를 구현해봤는데,, 예외 처리를 깊게 안해서 부끄럽네

 

 

2-1 queue 구현

 

public class ArrayQueque {
    private int max = 1000;
    private int front;
    private int rear;
    private int[] queue;

    public ArrayQueque() {
        front = rear = 0; // 생성자 호출 시 초기 값 0
        queue = new int[max]; // max 배열로 초기화
    }

    public boolean queueIsEmpty() { // queue가 비었는 지 확인 0 or -1
        return front == rear;
    }

    public boolean queueIsFull() { // queue가 다 찼는 지 확인
        if (rear == max - 1) {
            return true;
        } else
            return false;
    }

    public int size() { // 현재 데이터 갯수 리턴
        return front - rear;
    }

    public void push(int value) {
        if (queueIsFull()) {
            System.out.println("queue가 다 찼습니다.");
            return;

        }
        queue[rear++] = value;
    }

    public int pop() {
        if (queueIsEmpty()) {
            System.out.println("queue가 데이터가 없습니다.");
            return -1;
        }
        return queue[front++];
    }

    public int peek() {
        if (queueIsEmpty()) {
            System.out.println("queque에 데이터가 없습니다.");
            return -1;
        }
        return queue[front];
    }


    }

 

너무 간단하게 만들어서 더 깊게 만들고 싶다

 

 

 

 

 

 

2-2 list 두개로 관리해보기

 

private int[] solution(int[] progresses, int[] speeds) {


    ArrayList<Integer> list = new ArrayList<>();
    ArrayList<Integer> answerList = new ArrayList<>();
  

   

    for (int i = 0; i < progresses.length; i++) {
       
        list.add(progresses[i]);

    }

    //리스트가 빌 때 까지 각 요소마다 스피드만큼 올려준다.



    while (list.size() <= 0) {
        int count = 0;
        int size = list.size();

        for (int i = 0; i < size; i++) {

            int a = list.get(i);
            int b = speeds[i];
            if (a >= 100) {
                count++;
                list.remove(i);
            } else
            list.set(i,a + b);

        }
        if (count > 0) {
            answerList.add(count);
        }
    }


    int[] answer = new int[answerList.size()];

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

    return answer;
}

 

list로만 구현할 수 있을 거 같아서 도전했는데,,

이론은 틀리지 않았는데 잘 안된다.. 예전 풀이를 참고해보자!

 

 

2-3 arrayList로 구현

 

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

         List<Integer> answer = new ArrayList<>();

         for (int i = 0; i < progresses.length; i++) {
             // 1. 1개 기능을 개발하는데 필요한 날짜를 계산한다.
             double days = (100 - progresses[i] / (double) speeds[i]);
             // 100 - 30 / 30
             int dayUp = (int) Math.ceil(days); // days 실형 값을 올림해서 int로 캐스팅해서 dayUP에 담아줌 (걸리는 날짜가 담김)

             // 2. 함께 배포할 기능의 인덱스를 찾기.
             int j = i + 1;
             for (; j < progresses.length; j++) {
                 //j번째의 기능이 dayUP만큼 날짜가 지났을 때 개발이 완료되어 같이 배포할 수 있는 지 없는 지 알아보는 것
                 if (progresses[j] + dayUp * speeds[j] < 100)
                     break;}
                 // break 한 값이 함께 배포할 수 없는 첫번째 인덱스



             // 3. 이번에 배포할 기능의 갯수를 추가한다.
                 answer.add(j - i); //함께 배포할 수 없는 첫번째 인덱스에서 현재 기능의 위치를 빼주면 그 사이에 몇개를 배포할 수 있는 지 차이값을
                 //담아줌
                 i = j - 1; // i와 j사이에는 answer에 배포되었기때문에 그 다음 값은 i는 j번째에서 시작하길 원함

         }

         int[] answerArray = new int[answer.size()]; // 1.arrays를 int[]에 담아서 반환하기 위해
         for (int i = 0; i < answer.size(); i++) {
             answerArray[i] = answer.get(i);
         }
         return answerArray;
        

     }
 }

 

 

이론 상으로는 완벽한 거 같은데..?!

 

 

 

 

 

실제 결과 시 테스트 케이스 2개 성공하길래 기뻐서 제출해봤더니

 

이것도 실패다.. ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

 

 

 

3. 해답

 

 

못찾음 아직 ㅠㅠ (수정 예정)

 

 

4. 느낀 점

 

queue 구현 방식도 자주 써먹자 까먹지 않게 그리고 좀 더 완성도 있게 다듬어야겠다..

 

queue 사용 시 데이터를 수정해주고 빼오는 과정이 생각이 안떠올라 괴로웠다..

 

ArraysList로 만든 게 테스트는 통과하는데 실제 문제에서는 통과하지 못해서 의문이다..

 

분명 어렵지 않은데 좀 더 공부해야겠다.