https://school.programmers.co.kr/learn/courses/30/lessons/42586
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로 만든 게 테스트는 통과하는데 실제 문제에서는 통과하지 못해서 의문이다..
분명 어렵지 않은데 좀 더 공부해야겠다.
'알고리즘' 카테고리의 다른 글
99클럽 코테 스터디 5일차 TIL 더 맵게 (0) | 2024.05.24 |
---|---|
99클럽 코테 스터디 4일차 TIL 올바른 괄호 feat(queue.add vs offer) (0) | 2024.05.23 |
99클럽 코테 스터디 2일차 TIL 의상 (0) | 2024.05.21 |
99클럽 코테 스터디 1일차 TIL 전화번호 목록 (0) | 2024.05.20 |
백준 9375 패션왕 신해빈 (0) | 2024.01.24 |