티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/42891
🐢 설명
제각각 양이 다른 음식들이 있을 때 주어진 시간 k까지 1초에 하나씩 먹게 되고 k때 정전이 일어나면 그 이후에 먹어야 되는 음식의 번호를 구하는 문제이다.
생각해보자. 음식의 양이 9 3 5 7 1 씩 있을 때, 5번음식을 먹기 위해서는 5번의 이동이 필요하다. 한바퀴를 돌기 위해서 5번 이동해야 하므로. 그리고 난 후 3번 음식을 다 먹기 위해서는 9 3 5 7 1 -> 8 2 4 6이 되어있고 총 8번의 이동이 필요하다.
이렇게 생각하면 음식의 양이 가장 낮은 순으로 정렬하고, [(현재 음식과 직전 음식의 양 차이) * 현재 있는 음식의 개수]는 현재 가지고 있는 음식의 구성을 깨트리지 않고 이동을 할 수 있는 최대값이 된다.

그림처럼 양이 1인 음식은 move가 5이내 까지는 포함해서 먹을 수 있게 되고, 그 이후에는 LEN을 1줄여서 양이 1인 음식을 빼줘야한다. 이때 이동횟수는 1 * 5이므로 k -= 5가 되겠다.
이후 양이 3인 음식은 move가 높이(2) * 음식 가지수 (4) 인 8 이내까지는 포함해서 먹을 수 있게 된다.
- 만약 k가 8보다 크거나 같다면, k -= 8을하고 빼버리고, 음식 종류를 줄이면 된다.
- 만약 k가 8보다 작다면, 현재 음식 종류 내에서 방송중단이 발생한다는 의미이므로 (남은 먹기 회수) k % (남은 음식 종류) LEN을 통해 몇번째 음식을 먹어야 하는지 알 수 있다.
🐢코드
import java.util.*;
class Solution {
static ArrayList<Food> foodList = new ArrayList<>();
static PriorityQueue<Food> pq = new PriorityQueue<>(Comparator.comparingLong(f -> f.time));
static int LEN;
public int solution(int[] food_times, long k) {
LEN = food_times.length;
for (int i = 0; i < food_times.length; i++) {
pq.add(new Food(i + 1, food_times[i]));
}
long beforeFoodTime = 0;
while (!pq.isEmpty())
{
Food nowFood = pq.peek();
long diff = nowFood.time - beforeFoodTime;
if (diff != 0)
{
long spendTime = diff * LEN;
if (spendTime <= k) {
k -= spendTime;
beforeFoodTime = nowFood.time;
}
else {
foodList.addAll(pq);
Collections.sort(foodList, Comparator.comparingInt(f -> f.index));
return foodList.get((int)(k % LEN)).index;
}
}
pq.poll();
LEN--;
}
return -1;
}
private static class Food
{
int index;
long time;
public Food(int index, long time) {
this.index = index;
this.time = time;
}
}
}
🐢 마무리
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
(프로그래머스) 로또의 최고 순위와 최저 순위 (dev-matching 상반기) (0) | 2021.10.14 |
---|---|
(프로그래머스) 호텔 방 배정 (0) | 2021.09.17 |
(프로그래머스) 불량 사용자 (0) | 2021.09.15 |
(프로그래머스) 징검다리 건너기 (0) | 2021.09.14 |
(프로그래머스) 셔틀버스 [java] (0) | 2021.09.04 |
반응형
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday