우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/LeetCode 150

[Java] 373. Find K Pairs with Smallest Sums

2023. 9. 12. 09:23

문제 νŒŒμ•…

λΉ„ λ‚΄λ¦Όμ°¨μˆœμΈ 두 μ •μˆ˜ λ°°μ—΄ nums1 κ³Ό nums2 그리고 kκ°€ μ£Όμ–΄μ§„λ‹€.

 

k개의 κ°€μž₯ 합이 μž‘μ€ pair λ₯Ό λ°˜ν™˜ν•΄μ•Όν•œλ‹€.

 

 

풀이

1️⃣ PriortyQueue 와 μΌμ’…μ˜ 그리디 법을 ν™œμš©

 

πŸ’‘ μ°Έκ³ ν•œ Idea

이번 λ¬Έμ œλŠ”, 아무리 μ—΄μ‹¬νžˆ λ– μ˜¬λ €λ΄λ„ μ‹œκ°„ 초과 & λ©”λͺ¨λ¦¬ 초과 λ•Œλ¬Έμ— ν•΄κ²°ν•˜μ§€ λͺ»ν•˜κ³  λ‹€λ₯Έ μ‚¬λžŒμ˜ 아이디어λ₯Ό μ°Έκ³ ν•˜μ—¬ ν•΄κ²°ν•˜μ˜€λ‹€.

핡심 μ•„μ΄λ””μ–΄λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

λ¨Όμ €, 두 μ›μ†Œμ˜ 합을 κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜λŠ” μš°μ„ μˆœμœ„ 큐λ₯Ό μ€€λΉ„ν•œλ‹€.

nums1 λ°°μ—΄μ˜ μΈλ±μŠ€λŠ” 0 으둜 κ³ μ •ν•œ 채, nums2 배열을 μˆœνšŒν•˜λ©° 합을 κ΅¬ν•˜κ³  μš°μ„ μˆœμœ„ 큐에 μž…λ ₯ν•œλ‹€.

μš°μ„ μˆœμœ„ νμ—λŠ” [ nums1의 κ°’, nums2 의 κ°’, nums1의 인덱슀, nums1의 κ°’ +nums2의 κ°’ ] 으둜 μž…λ ₯ν•΄μ€€λ‹€.

이제 μš°μ„ μˆœμœ„ νμ—μ„œ poll()을 ν•˜λŠ”λ° μ—¬κΈ°μ„œ poll() ν•œ 값은 νμ—μ„œ 두 μ›μ†Œμ˜ 합이 κ°€μž₯ μž‘μ€ 값이 μΆ”μΆœλ  것이닀.

κ·Έλ ‡κ²Œ poll() ν•œ κ°’μ—μ„œ nums1의 인덱슀λ₯Ό 1 μΆ”κ°€ν•΄μ£Όκ³  (nums1 λ°°μ—΄μ˜ 길이λ₯Ό μ΄ˆκ³Όν•˜μ§€ μ•ŠλŠ” ν•œ) 

μš°μ„ μˆœμœ„ 큐에 λ‹€μ‹œ λ„£μ–΄μ€€λ‹€.

이 값을 λ‹€μ‹œ λ„£μ–΄μ£ΌλŠ” μ΄μœ λŠ”, 이 값은 μ œκ±°λ‹Ήν•œ κ°’κ³Ό κ°€μž₯ λΉ„μŠ·ν•œ μœ„μΉ˜μ˜ λ‹€λ₯Έ 쌍이 될 수 있고 이 합이 이미 λ“€μ–΄κ°„ λ‹€λ₯Έ μŒλ³΄λ‹€ 적은 합이 λ‚˜μ˜¬ 수 있기 λ•Œλ¬Έμ΄λ‹€.

말둜 μ„€λͺ…ν•˜λ‹ˆ μ•½κ°„ μ΄ν•΄ν•˜κΈ° νž˜λ“€ 수 μžˆλŠ”λ°, μ½”λ“œλ₯Ό 보면 이해가 잘 될 것이닀. 

 

 

import java.util.*;

class Solution {
    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        List<List<Integer>> ans = new ArrayList<>();
        PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[3] - b[3]);

        for (int i = 0; i < Math.min(k, nums2.length); i++) {
            pq.offer(new int[]{nums1[0], nums2[i], 0, nums1[0] + nums2[i]});
        }

        while (!pq.isEmpty() && k-- > 0) {
            int[] poll = pq.poll();
            int num1 = poll[0], num2 = poll[1];
            ans.add(List.of(num1, num2));

            int idx1 = poll[2];
            if (idx1 + 1 < nums1.length) {
                // num2와 μ œκ±°ν•œ num1 뒀에 μžˆλŠ” 수의 쑰합을 μΆ”κ°€
                pq.offer(new int[]{nums1[idx1 + 1], num2, idx1 + 1, nums1[idx1 + 1] + num2});
            }
        }


        return ans;
    }
}

 

κ²°κ³Ό


πŸ“– 회고

μ§€κΈˆκΉŒμ§€ ν’€μ—ˆλ˜ μš°μ„ μˆœμœ„ 큐 κ΄€λ ¨ 문제 쀑에 κ°€μž₯ μ–΄λ €μ› λ˜ λ¬Έμ œμ˜€λ‹€.

 

μš°μ„  μˆœμœ„ 큐λ₯Ό ν’€λ•Œμ—λŠ” μ–΄λ–€ 쑰건을 κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•˜μ—¬ 큐에 λ„£μ–΄μ•Ό 닡을 ꡬ할 수 μžˆλŠ”μ§€λ₯Ό 잘 νŒŒμ•…ν•΄μ•Όν•˜λŠ” 것 κ°™λ‹€κ³  λŠκΌˆλ‹€.

    'πŸ‘¨πŸ»‍πŸ’» PS/LeetCode 150' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [Java] 909. Snakes and Ladders
    • [Java] 133. Clone Graph
    • [Java] 215. Kth Largest Element in an Array
    • [Java] 212. Word Search II
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”