아래 링크를 참고하여 추천하는 75제부터 진행한다. 돈을 안냈기 때문에 프리미엄은 못푼다. https://www.teamblind.com/post/New-Year-Gift---Curated-List-of-Top-75-LeetCode-Questions-to-Save-Your-Time-OaM1orEU https://qkrrmsdud.tistory.com/9...
https://leetcode.com/problems/two-sum/description/ 간단히 풀려면 이중 for문으로 풀 수 있으나 시간복잡도가 O(n^2)이다. 그렇다면 O(n^2)보다 빠르게 해결하기 위해서는 다른 방법이 필요하다. 아이디어1 배열 자체를 오름차순 정렬해서 앞에서부터 탐색하며 합이 맞는 순간 종료한다. --> 배열 자체를 정렬하게...
https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/ 단순하게 2중 for문으로 푸는 경우 시간초과 발생함. 다른 방법으로 풀어야 한다. Constraints: 1 <= prices.length <= 10^5 0 <= prices[i] <= 10^4 다른 방법이 뭐가 있을...
https://leetcode.com/problems/contains-duplicate/description/ Arrays.sort로 오름차순 정렬하고 앞(적은 인덱스)에서부터 순회하다가 Duplicate인 것을 만나는 순간 종료하는 것은 어떨까? java 8버전 기준 primitive type인 경우 Dual-Pivot QuickSort 쓴다고 알고있...
https://leetcode.com/problems/product-of-array-except-self/description/ 기본 목표는 나눗셈을 하지 않고 O(n)을 달성하는 것이다. 당연히 2중 for문은 불가하다. 나눗셈을 쓰지 말라는 것은 왜일까? nums의 총합을 곱해 total을 찾아놓고, 해당 인덱스 값을 나누면 너무 쉽기 때문인 듯. ...
https://leetcode.com/problems/maximum-subarray/description/ 기본아이디어 처음 인덱스부터 순회하면서 temp sum(누계)을 만들어 두고, 갱신할 max 변수도 설정해둔다. 만약 누계가 current, 즉 nums[i]보다 작다면 왼쪽부터 계산했던 값을 그냥 버린다. 즉, 현재 누계 = nums[i]로 만든...
https://leetcode.com/problems/maximum-product-subarray/description/ 이 문제는 기본적으로 maximum subarray와 같아 보이지만 굉장히 다르다. 곱셈의 특성 때문이다. 음수와 양수의 곱은 음수가 되기 때문에 다음 숫자에 따라 더 커질 수도, 작아질 수도 있기 때문이다. 그래서 단순히 누계가...
https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/ 문제에서 제시한 시간복잡도는 O(log n)이다. 정렬된 배열이 n바퀴 돌았다고 가정하는 것이니.. 이분탐색을 해서 찾으라는 건가? 정렬된 배열이 아니라 n바퀴 돈 배열이니 한 번 비튼 문제인 듯 하다. mid를...
https://leetcode.com/problems/search-in-rotated-sorted-array/description/ 이 문제는 Find Minimum in Rotated Sorted Array 문제와 마찬가지로 O(log n) 시간복잡도를 요구한다. 또한 정렬된(rotated 되었지만) 배열을 대상으로 하므로 이분탐색 문제인 것을 알 수...
https://leetcode.com/problems/3sum/description/ Medium 문제기 때문에 당연히 O(n^3)으로는 하지 않는 것을 생각한다. i, j, k가 있을 때 j+k 합산과 i를 더했을 때 0이면 타켓이라고 볼 수 있긴 하다. 그럼 일단 O(n^2)까지는 가능할 것 같다. 맵에 i에 대한 value, index를 세팅해놓고...
https://leetcode.com/problems/container-with-most-water/description/ 일단 미디엄 문제이기 때문에 O(n^2)는 버리는 것으로 생각하고 .. 투포인터를 쓰면 될 것 같다. while로 순회마다 두 포인터 중 하나는 감소하거나 증가할테니 O(N) max 변수를 설정해두고 Math.max로 갈아치워준 ...
https://leetcode.com/problems/sum-of-two-integers/description/ 비트연산자가 익숙하지는 않아 솔루션 참고한다. Carry값을 찾으려면 AND 연산을 하면 되고 XOR 연산을 하면 캐리 고려하지 않고 합계를 계산할 수 있다고 한다. 캐리를 찾았으면 시프트연산해서 자릿수를 올려주고 더이상 캐리가 존재하지 않...
https://leetcode.com/problems/number-of-1-bits/description/ 참고: Integer 클래스에는 bitCount라는 메서드가 존재한다. 솔루션 참고해보니 -1 값과 함께 AND연산해가며 카운트하는 방식이 있고 아니면 int가 32비트라는 점을 참고해서 32번의 shift와 AND연산하며 카운팅하는 방식이 있다....
https://leetcode.com/problems/counting-bits/description/ 문제에서 O(n log n)으로 풀면 쉽지만 O(n) 시간으로 풀 수 있는지 묻고 있다. O(n log n)으로 푸는 방식은 0 ~ n 까지 수행 * 각 순회마다 비트수 계산이다. 비트 수 계산은 Number of 1 Bits 문제에서 사용한 것과 같...
https://leetcode.com/problems/missing-number/description/ O(n) 시간복잡도로 풀라는데, 사실 Binary라고 고정하지 않고 생각하면 쉽다. 그냥 n+1 사이즈로 카피 배열을 만들어서 nums[i]값을 인덱스로 값을 세팅해주면 된다.. boolean이든, 아니면 범위에서 벗어난 int값(예를 들어 -1)을 ...
https://leetcode.com/problems/reverse-bits/description/ int자료형 32비트이므로 32번의 순환 + 시프트연산으로 O(1)으로 해결할 수 있을거란 생각을 했다. 아이디어까지는 좋았으나 마지막비트 누적 연산에서 오류가 있어 통과하지 못하는 케이스가 있었다. 결국 뒤집을 대상(n)의 마지막 비트를 OR 연산하면...
https://leetcode.com/problems/climbing-stairs/description/ DP의 입문이고 많이 본 문제다. 간단하게 풀어본다. 1까지 가는 경우의 수 = 1 (1 step) 2까지 가는 경우의 수 = 2 (1 step + 1 step OR 2 steps) 3부터는 i-1 + i-2가 됨 왜냐? 1 step으로 가는 경우...
https://leetcode.com/problems/coin-change/description/ > 이 문제를 코인 크기대로 정렬한 뒤 큰 순서대로 나누고 나머지 연산으로 누적해간다는 아이디어를 떠올린다면 틀린 것이다. 모르겠으면 아래 경우를 테스트케이스에 추가해 보라. coins = [3, 5], amount = 9 아이디어는 아래와 같다. 우선 ...
https://leetcode.com/problems/longest-increasing-subsequence/description/ 문제에서 O(n log n)으로 풀어보라는 챌린지가 있는데 바로 떠오르진 않고.. O(n^2)는 다음과 같이 할 수 있겠다. nums길이와 똑같은 배열을 만들어서 1로 초기화한다(자기 자신 포함 길이기 때문에 최소 1). ...
https://leetcode.com/problems/longest-common-subsequence/description/ 힌트를 참고해서 2차원 배열로 dp배열을 만들면 된다는 아이디어를 보고.. text1과 text2의 길이를 이용한 dp배열을 만들었다. 이후 2중 for문으로 dpi값을 제어하면 되는데, text1의 i-1 번째와 text2의 j...
https://leetcode.com/problems/word-break/description/ DP왜이렇게 어렵냐.. 고민하다 솔루션 참고 아이디어는 s 길이 + 1만큼의 boolean dp[] 배열을 만들고 해당 인덱스까지(== 문자열에서 해당 포인트까지) 접근 가능한지 여부를 true/false 세팅해둔 뒤 최종적으로 dp[s.length()]하...
https://leetcode.com/problems/combination-sum-iv/description/ Climbing Stairs의 심화버전 같은 문제다. 경우의 수가 nums만큼이 있으므로 이것을 계산해야 한다. dp 배열은 다른 문제들과 같이 target+1 길이를 가지는 int배열로 만들어 주고, dp[target]을 통해 가능한 경우의...
https://leetcode.com/problems/house-robber/description/ 기본적으로 아이디어가 중요하다. 선택지는 2가지가 있다. 현재 인덱스를 터느냐/마느냐다. DP로 풀 때 dp[i]는 i-1 값과 i-2 + (현재인덱스 amount) 중 큰 값으로 넣으면 된다. i-1 값을 그대로 i에 세팅한다는 것은 현재 인덱스(i)...
https://leetcode.com/problems/house-robber-ii/description/ house robber 문제에서 변형이 된 문제다. 집들이 원형으로 이어져 있다는 전제가 추가되었다. 0 ~ n-1 까지 탐색하면 원형 조건에 걸리지 않는다(맨 마지막 집 계산 제외). 1 ~ n 까지 탐색하면 원형 조건에 걸리지 않는다(맨 처음 집...
https://leetcode.com/problems/decode-ways/description/ 숫자는 한자리가 될 수도, 두 자리가 될 수도 있다. 기본적인 아이디어는 dp[i]에 두 자리로 가능한 경우 dp[i - 2]의 값을 누적하고, 한 자리로 가능한 경우 dp[i - 1]의 값을 누적한다. 다만, 중요한 것은 두 경우가 다 가능할 수 있기 ...
https://leetcode.com/problems/unique-paths/description/ 오른쪽과 아래로만 이동 가능하다는 제약이 있다. 그렇다면 i, j 에는 i-1과 j-1값을 더해주면 된다고 생각했다. 방어조건으로는 n이나 m이 1인 경우 무조건 1을 리턴하도록 했다 (한가지 수밖에 없음) dp는 m 사이즈로 세팅해주고, 경우의 수 누...
https://leetcode.com/problems/jump-game/description/ DP는 익숙해지지가 않음.. 핵심 아이디어는 i + nums[i] 가 goal보다 크거나 같으면 닿을 수 있다는 것 goal은 다시 i로 초기화하고 점진적으로 0까지 갈 수 있는지 확인하면 된다. i + nums[i] >= goal 이라면 i까지만 와도 유...
https://leetcode.com/problems/clone-graph/description/ 무방향 그래프 탐색을 하면서 깊은 복사를 하는 문제인 것 같다. Node 인스턴스를 새로 만들어야 한다는 뜻 DFS, BFS 어떤 방식으로든 탐색이 가능할 것 같다. BFS 방식 Queue를 이용해서 poll(), 이어지는 노드는 offer() - 큐가 ...
https://leetcode.com/problems/course-schedule/description/ 아이디어가 떠오르지 않아서 시간초과로 솔루션 참고함 위상 정렬을 통해 유향 그래프에 사이클이 존재하는지 여부를 체크하는 것이 핵심 진입차수를 기록하는 별도의 배열을 만들어서 관리하며 인접리스트를 사용해 선행과 후행의 연결고리를 관리한다. 진입차수...
https://leetcode.com/problems/pacific-atlantic-water-flow/description/ 이런 문제는 재밌어 보인다. 2중 for문 돌면서 특정 r 인덱스에 있는 정점으로부터 출발해 Pacific과 Atlantic에 모두 닿을 수 있는지 체크하면 될 것 같다. 그럼 Pacific에 닿는다는 것과 Atlantic에 ...
https://leetcode.com/problems/number-of-islands/description/여기저기서 많이 본 것 같은 섬 찾기 문제다.보면 떠오르는 아이디어는0, 0부터 시작해서 m, n 까지 순회하며 "1"로 시작하는 경우 뻗어나간 부분을
https://leetcode.com/problems/longest-consecutive-sequence/description/이걸 왜 그래프로 분류했는지 모르겠다, n+1이나 n-1에 대해 노드를 연결하나..?어쨌든 문제에서는 O(n) 시간복잡도로 풀라고 지
https://leetcode.com/problems/insert-interval/description/ 핵심은 merge 액션이다. 기준값을 계속 갱신해가며 Math.min과 Math.max 활용해서 범위를 넓힌다. 3가지 경우로 나눌 수 있고, 각각에 대해 처리해준다. newInterval보다 왼쪽에 있는 경우 merge 대상인 경우 newInte...
https://leetcode.com/problems/merge-intervals/description/ 이전 문제와 비슷한데 newInterval과 같은 추가 파라미터를 주는게 아니라 원본 배열 요소 내에서 머지하는 문제다. 핵심은 start 순으로 정렬되어있어야 풀기가 쉽다는 건데, 문제에서 intervals가 정렬된 상태라는 말이 없으므로 배열을 ...
https://leetcode.com/problems/non-overlapping-intervals/description/ 최소한으로 제거하는게 목적이기 때문에 end 기준으로 배열을 정렬하는게 중요하다. start 기준으로 했을 경우 [1,10], [2,3], [4,5], [6,7] 이런 케이스에서 문제가 될 수 있다. 이 경우 end기준 정렬하면 1...
https://leetcode.com/problems/reverse-linked-list/ Linked List를 거꾸로 만드는 문제다. prev, current 두 가지 변수로 다룰 수 있겠다. 연결된 요소 모두 순회하기 때문에 while (current != null) 조건으로 반복한다. 내부적으로 스왑을 위해서는 헷갈리지만 간단한 공식으로 한다. ...
https://leetcode.com/problems/linked-list-cycle/description/ 단방향 Linked List에서 사이클이 있는지 판단하는 문제같다. 일단 떠오르는건 HashSet을 써서 방문한 ListNode인지 판단할 수 있을 것 같은데 (hashCode(), equals() 미 오버라이드로 동일성 기준 해시 뽑힐듯) 그렇...
https://leetcode.com/problems/merge-two-sorted-lists/description/ 두 개의 Linked List를 순서대로 합치는 것 같은데, 간단하겠다. 보통 이런 문제는 while문 세 개 써서 돌리는데, 둘 다 next가 있는 경우 list1의 next가 남아 있는 경우 list2의 next가 남아 있는 경우 ...
https://leetcode.com/problems/merge-k-sorted-lists/description/ 난이도가 Hard라서 덜덜한데 뭔가 이전 문제랑 아이디어가 비슷할 것 같다. Dummy 포인터 주고서 배열들 중 가장 낮은 값으로 이어붙이면 되는 것 아닌가? 근데 중요한건 개별 Linked List들이 몇 개가 있을지 모른다는 거다. 순회...
https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/ 뒤에서부터 N번째 노드를 지워야 한다. 그래서 제일 처음 푼 방식은 각 노드 순회마다, 그 노드로부터 next가 없는 마지막 노드까지의 길이를 구하도록 했다. 그 다음 prev가 있으면 포인터를 갈아치워 주고, prev...
https://leetcode.com/problems/reorder-list/description/ L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 순서대로 정렬하라는데.. 중간을 찾아서 중간 뒤에서부터는 역순으로 정렬하고 머지하는 과정이 필요하겠다. 중간은 fast, slow 포인터로 O(N)으로 찾을 수 있다. slow는 한...
https://leetcode.com/problems/set-matrix-zeroes/description/ 처음에는 배열 모두 순회하면서 Queue에 0이 들어있는 위치를 넣고, 이 i, j 값을 기준으로 해당 행과 열을 모두 0으로 세팅하도록 코드를 짰다. 참고로 그냥 배열 두 개 더 만들어서 행,열 인덱스 boolean 체크해두고 순회하면서 체크해...
https://leetcode.com/problems/spiral-matrix/description/ 우, 하, 좌, 상 방향으로 매트릭스를 순회하는 문제다. 내가 생각하는 핵심 코드는 아래와 같이 구성되어야 함 방향 배열 정하기 (우, 하, 좌, 상) + 방향 배열 인덱스 visited 배열로 이미 방문한 지점 체크 x와 y값을 기준 방향 배열에 따라...
https://leetcode.com/problems/rotate-image/description/ 우측으로 90도 돌리는 경우 핵심은 두 가지다. 전치 (행과 열을 바꿈) 반전 (n - 1 - i) , 여기서 n은 length, i는 순회 인덱스 즉 새 배열을 만들어서 푸는 경우 위 공식을 적용해 아래와 같이 회전할 수 있다. 근데 이 문제는 in-...
https://leetcode.com/problems/word-search/description/ 처음에 BFS로 풀어보려고 시도했는데, visited 체크가 과하다는 생각이 들었다. 왜냐면 각 경로마다 한 번씩이지 글로벌하게 중복체크가 들어가선 안되기 때문이다. 그럼 큐에 넣을 때마다 각각의 visited 체크 배열(또는 무엇이든)이 들어가야 한다. ...
https://leetcode.com/problems/longest-substring-without-repeating-characters/description/ 중복 없이 가장 긴 서브스트링의 길이를 반환하란다. 배열이든 뭐든 사용해서 슬라이딩 윈도우 구간 내 중복 문자가 있는지 체크하면 된다. 문제에서 s는 영문자, 숫자, 심볼이나 스페이스도 다 포함...
https://leetcode.com/problems/longest-repeating-character-replacement/description/ 뭔가 예전에 풀었던 것 같은데... 어쨋든 보면 딱 떠오르는건 이것도 슬라이딩 윈도우다. 윈도우 크기를 정할 때 k를 어떻게 사용할 것인가? (right - left + 1) 에서 최빈 알파벳 수를 뺀게 k...
https://leetcode.com/problems/minimum-window-substring/description/ 나중에
https://leetcode.com/problems/valid-anagram/description/ 아스키로 가정하면 그냥 배열에서 증감처리하고 숫자 전부 일치하는지 보면 될 것 같은데 (참고로 아래 코드도 더 리팩터링 가능, 정상적인 anagram이면 둘이 length 같아야 하므로 굳이 두 번 돌 필요 없음. 길이 체크로 가지치고, 한 번만 돌면서 ...
https://leetcode.com/problems/group-anagrams/description/ 처음에는 각 요소의 int 합으로 (sum += c - 'a') 애너그림인지 확인하려고 했다. 뭉청한 생각인건 다른 조합으로도 같은 sum이 나올 수 있다는 점을 생각 안 한 것이다. 따라서 정말 유일하게 식별할 수 있는게 필요한데, 아스키 문자별로...
https://leetcode.com/problems/valid-parentheses/description/ 흔한 스택 문제 알고리즘 문제 푸는데 아무 영향 없겠지만 Stack은 동기화블록 오버헤드 있으므로 걍 Deque(ArrayDeque)씀
https://leetcode.com/problems/valid-palindrome/description/ 간단하게 풀려면 replaceAll 정규식으로 알파벳, 숫자만 남기고 toLowerCase 한다. 이게 팰린드롬인지 확인하는거야 StringBuilder 써서 reverse 해도 되고, 아니면 절반만큼 순회하면서 left, right가 같은지 체크...
https://leetcode.com/problems/longest-palindromic-substring/description/ 처음에 슬라이딩 윈도우 방식을 생각하고 고민해보다가 실패 왜? 단조성이 없다. 즉, left를 당겨서 조건에 맞는 윈도우 갱신을 할 수가 없음. 그것에 대한 기준이 없기 때문. 결국 최소 O(N^2)으로 풀어내야 하는 문제로...
https://leetcode.com/problems/palindromic-substrings/description/ 이전 문제를 참고해서 "팰린드롬의 중심 확장" 개념을 익혔다. 그것을 기반으로 해서 똑같이 odd기준, even기준으로 최대 확장될 수 있는 팰린드롬 카운트를 세서 계속 누적하면 정답이 나올 것 같았고, 실제로 그랬다. 다른 풀이를 참고...
https://leetcode.com/problems/maximum-depth-of-binary-tree/ 최대 깊이를 리턴해야 하는 문제다. 재귀로 left, right 돌려서 둘 중 큰 값에 + 1하면 된다.
https://leetcode.com/problems/same-tree/description/ 두 개의 트리가 완전히 동일한지 체크하는 문제다. 같은 기준으로 잡고 재귀로 풀어내면 될 거라고 생각했다. 탈출조건은 아래와 같다 둘다 null이면 같은 것이므로 true 둘 중 한 쪽만 null이면 다른 것이므로 false 둘의 값이 다르면 다른 것이므로 f...
https://leetcode.com/problems/invert-binary-tree/description/ 이진트리를 뒤집는 문제다. 그림만 보면 아래 액션으로 해결할 수 있어 보임. 현재 노드의 left와 right 포인터를 뒤바꾼다. left, right 각각에 대해 재귀적으로 이 작업을 반복한다. 다만 root를 리턴하라고 했으므로 재귀 함수...
https://leetcode.com/problems/binary-tree-maximum-path-sum/description/ 경로 중 최대값을 찾는 문제다. 핵심은 아래와 같다. Q. 어떻게 노드 별 최대 경로값을 찾나? A. 후위 순회로 left + right 값을 구하고 현재 node의 값을 더해서, 본 node가 root인 서브트리에서의 경로 ...
https://leetcode.com/problems/binary-tree-level-order-traversal/description/ 트리 레벨 별 노드를 리스트에 담아서 주면 된다는 것 같은데, 대놓고 BFS 문제인 것 같다. 이렇게 각 순회마다 레벨 정보를 알고 있어야 풀 수 있는 문제라면, 대표적으로 두 가지 방법으로 풀어낼 수 있다. 큐에 ...
https://leetcode.com/problems/serialize-and-deserialize-binary-tree/description/ 이진 트리에 대한 직렬화, 역직렬화를 구현하는 문제다. 이진트리는 배열로도 레벨 별 요소를 표현할 수 있다는 점을 활용하면 될 것 같다. 예를 들어 [1,2,3,null,null,4,5]에서 ~0번: level...
https://leetcode.com/problems/subtree-of-another-tree/description/ root와 subRoot 두 개의 트리가 주어졌을 때, root 안에 subRoot 트리와 완전히 동일한 서브트리가 있는지 확인하는 문제다. (당연히 인스턴스가 같은게 아니라, 구조와 노드 값들이 똑같은 것) 트리가 이진 탐색 트리도 ...
https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/ 핵심 아이디어는 전위 순회를 베이스로 루트를 선택하고, 그 루트를 기준으로 왼쪽 서브트리, 오른쪽 서브트리 순으로 순회하는 것 그래도 혼자 생각할 때 아이디어가 안 떠올라서 ...
https://leetcode.com/problems/validate-binary-search-tree/description/ Binary Search Tree가 유효한지 검사하는 문제다. 이진 탐색 트리에서 왼쪽 서브트리의 모든 노드는 루트보다 작아야 하고, 오른쪽 서브트리의 모든 노드는 루트보다 커야 한다. 그러므로 재귀적으로 풀 때 min, max...
https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/ Binary search tree가 주어졌을 때 k번째로 작은 수를 찾는 문제다. 핵심은 중위 순회다. Binary search tree 특성 상 중위 순회하면서 count를 증/감 시키면 이것이 몇 번째로 작은 값인지 판단...
https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/ LCA(Lowest Common Ancestor) 찾는 문제. 두 노드 간의 최저 공통 조상이란, 두 노드를 모두 자식으로 갖는 가장 깊은 조상을 의미한다(후손에는 자신도 포함할 수 있음). 핵...
https://leetcode.com/problems/implement-trie-prefix-tree/description/ 음 이거 풀었던 문제네 https://velog.io/@potato_song/Trie-Medium-Implement-Trie-Prefix-Tree
https://leetcode.com/problems/design-add-and-search-words-data-structure/description/ 이것도 문제를 보면 기본적으로 Trie를 생각해야 할 것 같다. 마찬가지로 각 노드당 isEnd 플래그를 두어 끝 문자까지 탐색이 완전히 되었는지 본다. 기본 Trie 구현문제와 달리 이 문제에서 생각...
https://leetcode.com/problems/word-search-ii/description/ 나중에
https://leetcode.com/problems/merge-k-sorted-lists/description/ 이전에 풀었던 문제 같은데, 간단하게 다시 정리할 수 있다. 각 lists 요소는 ListNode 형태로, 이미 오름차순 정렬된 리스트다. 그러므로 PriorityQueue(우선순위는 node.val 기준)를 사용해서 첫 노드들을 모두 담아...
https://leetcode.com/problems/top-k-frequent-elements/description/ 문제 종류가 Heap이고, 빈도 수가 가장 높은 k개의 숫자를 배열로 리턴하란다. 그럼 먼저 떠오른게 PriorityQueue인데, 문제는 뭘 기준으로 정렬하느냐다. 당연히 정렬은 빈도다. 근데 빈도는 아직 모른다. 그럼 빈도 먼저 O...
https://leetcode.com/problems/find-median-from-data-stream/description/ 문제 구성만 보면 PriorityQueue 사용해서 어떻게든 풀 수 있는 것 같은데.. 비효율적이지만 일단 정확성만 생각하고 아래같이 풀어봤다. 당연히 테스트케이스가 커지면 문제가 생김.. 원본 PQ에 계속해서 연산 시도하고 ...