[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / Java] - ๋ฌด์ง€์˜ ๋จน๋ฐฉ ๋ผ์ด๋ธŒ

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

๋ฌด์ง€์˜ ๋จน๋ฐฉ ๋ผ์ด๋ธŒ
์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ฌด์ง€์˜ ๋จน๋ฐฉ ๋ผ์ด๋ธŒ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
school.programmers.co.kr

๐Ÿ’ก ๋ฌธ์ œ ํŒŒ์•…

  • ์Œ์‹์„ 1๋ฒˆ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ, 1์ดˆ์— 1๊ฐœ์”ฉ ๋จน๋‹ค๊ฐ€ ๋‚จ์€ ์‹œ๊ฐ„์ด 0์ธ ์Œ์‹์€ ๊ฑด๋„ˆ๋›ด๋‹ค.
  • ๋งˆ์ง€๋ง‰ ์Œ์‹๊นŒ์ง€ ๋‹ค ๋จน์œผ๋ฉด ๋‹ค์‹œ 1๋ฒˆ ์Œ์‹์œผ๋กœ ๋Œ์•„๊ฐ€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • k์ดˆ ํ›„์— ๋จน๊ณ  ์žˆ์„ ์Œ์‹์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋ฉฐ, k์ดˆ๊ฐ€ ๋˜๊ธฐ ์ „์— ๋ชจ๋“  ์Œ์‹์„ ๋‹ค ๋จน์–ด๋ฒ„๋ฆฌ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • k๊ฐ€ ์ตœ๋Œ€ 2 ร— 10^13๊นŒ์ง€ ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ์–ด, ๋งค ์ดˆ ํ•˜๋‚˜์”ฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ์‹์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๐Ÿ—๏ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

  • ๋‚จ์•„์žˆ๋Š” ๋ชจ๋“  ์Œ์‹์˜ ์‹œ๊ฐ„์„ ํ•œ ์ธต์”ฉ ๋™์‹œ์— ๊นŽ์•„๋‚˜๊ฐ„๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด [3, 1, 2]๋ผ๋ฉด [2, 0, 1] โ†’ [1, 0, 0] โ†’ [0, 0, 0] ์ˆœ์œผ๋กœ ์ค„์–ด๋“ ๋‹ค.
  • ๊ฐ€์žฅ ์ ๊ฒŒ ๋‚จ์€ ์Œ์‹๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ด์ „์— ๊นŽ์•„๋‚ธ ์ธต ์ˆ˜๋ฅผ prev, ๋‚จ์€ ์Œ์‹ ๊ฐœ์ˆ˜๋ฅผ remain์ด๋ผ ํ•˜๋ฉด, ์ตœ์†Œ ์‹œ๊ฐ„์˜ ์Œ์‹๊นŒ์ง€ ํ•œ ์ธต์„ ๊นŽ๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์€ (cur - prev) * remain์ด๋‹ค.
    • k๊ฐ€ ์ด ์‹œ๊ฐ„๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ๊ทธ ์ธต ์ „์ฒด๋ฅผ ์‹ค์ œ๋กœ ๊นŽ์•„๋‚ด๊ณ (์‹œ๊ฐ„์ด 0์ด ๋œ ์Œ์‹๋“ค์€ ํ์—์„œ ์ œ๊ฑฐ), ์ž‘์œผ๋ฉด ๋” ์ด์ƒ ํ•œ ์ธต ์ „์ฒด๋ฅผ ๊นŽ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๋ฐ˜๋ณต์„ ์ข…๋ฃŒํ•œ๋‹ค.
  • ๋ฐ˜๋ณต์ด ๋๋‚˜๋ฉด ๋‚จ์€ ์Œ์‹๋“ค์„ ์›๋ž˜ ๋ฒˆํ˜ธ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ , k % remain ๋ฒˆ์งธ ์Œ์‹์„ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿงฉ ์ฝ”๋“œ ๊ตฌํ˜„

import java.util.*;

class Solution {
    public int solution(int[] food_times, long k) {
        long total = 0;
        for (int time : food_times) {
            total += time;
        }

        if (total <= k) {
            return -1;
        }

        PriorityQueue<int[]> pq = new PriorityQueue<>( // {time, idx}
            Comparator.comparingInt(arr -> arr[0])
        );

        for (int idx = 0; idx < food_times.length; ++idx) {
            pq.offer(new int[]{food_times[idx], idx + 1});
        }

        long prev = 0;
        long remain = food_times.length;

        while (!pq.isEmpty()) {
            long cur = pq.peek()[0];
            long spend = (cur - prev) * remain;

            if (k >= spend) {
                k -= spend;
                prev = cur;

                while (!pq.isEmpty() && pq.peek()[0] == cur) {
                    pq.poll();
                    remain--;
                }
            } else {
                break;
            }
        }

        List<int[]> foods = new ArrayList<>(pq);
        foods.sort(Comparator.comparingInt(a -> a[1]));

        return foods.get((int) (k % remain))[1];
    }
}