Skip to content

Commit 6f3a03a

Browse files
authored
2025년 14주차 문제 풀이 (#39)
## 문제 풀이 목록 - [LeetCode 2551. Put Marbles in Bags](https://leetcode.com/problems/put-marbles-in-bags) ✨ - [LeetCode 2140. Solving Questions With Brainpower](https://leetcode.com/problems/solving-questions-with-brainpower) - [LeetCode 2873. Maximum Value of an Ordered Triplet I](https://leetcode.com/problems/maximum-value-of-an-ordered-triplet-i) - [LeetCode 2874. Maximum Value of an Ordered Triplet II](https://leetcode.com/problems/maximum-value-of-an-ordered-triplet-ii) :sparkles: - [LeetCode 1123. Lowest Common Ancestor of Deepest Leaves](https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves) - [LeetCode 1863. Sum of All Subset XOR Totals](https://leetcode.com/problems/sum-of-all-subset-xor-totals) - [LeetCode 368. Largest Divisible Subset](https://leetcode.com/problems/largest-divisible-subset)
1 parent 590ac79 commit 6f3a03a

File tree

18 files changed

+430
-98
lines changed

18 files changed

+430
-98
lines changed

solution/src/leetcode/0368/0368.ts

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,29 @@
44
*/
55
export function largestDivisibleSubset(nums: number[]): number[] {
66
nums.sort((a, b) => a - b);
7+
78
const n = nums.length;
89
const dp = new Array<number>(n).fill(1);
10+
const prev = new Array<number>(n).fill(-1);
911

10-
let maxSize = 1;
1112
let maxIndex = 0;
12-
for (let i = 0; i < n; i++) {
13+
for (let i = 1; i < n; i++) {
1314
for (let j = 0; j < i; j++) {
14-
if (nums[i] % nums[j] !== 0) continue;
15-
dp[i] = Math.max(dp[i], dp[j] + 1);
16-
if (maxSize < dp[i]) {
17-
maxSize = dp[i];
18-
maxIndex = i;
15+
if (nums[i] % nums[j] === 0 && dp[i] < dp[j] + 1) {
16+
dp[i] = dp[j] + 1;
17+
prev[i] = j;
1918
}
2019
}
20+
if (dp[maxIndex] < dp[i]) {
21+
maxIndex = i;
22+
}
2123
}
2224

23-
const answer = [];
24-
let maxNum = nums[maxIndex];
25-
for (let i = maxIndex; 0 <= i; i--) {
26-
if (maxNum % nums[i] === 0 && dp[i] === maxSize) {
27-
answer.push(nums[i]);
28-
maxNum = nums[i];
29-
maxSize -= 1;
30-
}
25+
const answer: number[] = [];
26+
let currentIndex = maxIndex;
27+
while (currentIndex !== -1) {
28+
answer.push(nums[currentIndex]);
29+
currentIndex = prev[currentIndex];
3130
}
3231
return answer;
3332
}

solution/src/leetcode/1123/1123.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export function lcaDeepestLeaves(root: TreeNode | null): TreeNode | null {
1919
}
2020
return Math.max(leftMaxDepth, rightMaxDepth);
2121
}
22+
2223
traverse(root, 0);
2324
return answer;
2425
}

solution/src/leetcode/1863/1863.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,7 @@
33
* https://leetcode.com/problems/sum-of-all-subset-xor-totals
44
*/
55
export function subsetXORSum(nums: number[]): number {
6-
function backtrack(prev: number, i: number): number {
7-
if (i === nums.length) {
8-
return prev;
9-
}
10-
let ret = 0;
11-
const num = nums[i];
12-
ret += backtrack(prev ^ num, i + 1);
13-
ret += backtrack(prev, i + 1);
14-
return ret;
15-
}
16-
return backtrack(0, 0);
6+
const n = nums.length;
7+
const totalOR = nums.reduce((prev, num) => prev | num, 0);
8+
return totalOR << (n - 1);
179
}

solution/src/leetcode/2140/2140.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,11 @@
44
*/
55
export function mostPoints(questions: number[][]): number {
66
const n = questions.length;
7-
const dp = new Array<number>(n).fill(0);
7+
const dp = new Array<number>(n + 1).fill(0);
88

9-
const dfs = (i: number) => {
10-
if (n <= i) {
11-
return 0;
12-
}
13-
if (dp[i] !== 0) {
14-
return dp[i];
15-
}
16-
const [point, brainPower] = questions[i];
17-
dp[i] = Math.max(dfs(i + 1), point + dfs(i + brainPower + 1));
18-
return dp[i];
19-
};
20-
21-
return dfs(0);
9+
for (let i = n - 1; i >= 0; i--) {
10+
const [points, brainpower] = questions[i];
11+
dp[i] = Math.max(points + dp[Math.min(n, brainpower + i + 1)], dp[i + 1]);
12+
}
13+
return dp[0];
2214
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { putMarbles } from './2551';
2+
3+
describe('LeetCode 2551', () => {
4+
test('Example 1', () => {
5+
expect(putMarbles([1, 3, 5, 1], 2)).toBe(4);
6+
});
7+
test('Example 2', () => {
8+
expect(putMarbles([1, 3], 2)).toBe(0);
9+
});
10+
});

solution/src/leetcode/2551/2551.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* 2551. Put Marbles in Bags
3+
* https://leetcode.com/problems/put-marbles-in-bags
4+
*/
5+
export function putMarbles(weights: number[], k: number): number {
6+
const n = weights.length;
7+
const pairWeights: number[] = [];
8+
for (let i = 0; i < n - 1; i++) {
9+
pairWeights.push(weights[i] + weights[i + 1]);
10+
}
11+
pairWeights.sort((a, b) => a - b);
12+
13+
let answer = 0;
14+
for (let i = 0; i < k - 1; i++) {
15+
answer += pairWeights[n - i - 2] - pairWeights[i];
16+
}
17+
return answer;
18+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"id": "2551",
3+
"url": "https://leetcode.com/problems/put-marbles-in-bags",
4+
"title": "Put Marbles in Bags",
5+
"category": "Algorithms",
6+
"difficulty": "Hard",
7+
"tags": ["Array", "Greedy", "Sorting", "Heap (Priority Queue)"]
8+
}

solution/src/leetcode/2873/2873.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ export function maximumTripletValue(nums: number[]): number {
66
const n = nums.length;
77

88
let answer = 0;
9-
let maxi = Math.max(nums[0], nums[1]);
10-
let maxij = nums[0] - nums[1];
9+
let maxI = Math.max(nums[0], nums[1]);
10+
let maxDiff = nums[0] - nums[1];
1111
for (let k = 2; k < n; k++) {
12-
answer = Math.max(answer, maxij * nums[k]);
13-
maxi = Math.max(maxi, nums[k - 1]);
14-
maxij = Math.max(maxij, maxi - nums[k]);
12+
answer = Math.max(answer, maxDiff * nums[k]);
13+
maxDiff = Math.max(maxDiff, maxI - nums[k]);
14+
maxI = Math.max(maxI, nums[k]);
1515
}
1616
return answer;
1717
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { maximumTripletValue } from './2874';
2+
3+
describe('LeetCode 2874', () => {
4+
test('Example 1', () => {
5+
expect(maximumTripletValue([12, 6, 1, 2, 7])).toBe(77);
6+
});
7+
test('Example 2', () => {
8+
expect(maximumTripletValue([1, 10, 3, 4, 19])).toBe(133);
9+
});
10+
test('Example 3', () => {
11+
expect(maximumTripletValue([1, 2, 3])).toBe(0);
12+
});
13+
});

solution/src/leetcode/2874/2874.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* 2874. Maximum Value of an Ordered Triplet II
3+
* https://leetcode.com/problems/maximum-value-of-an-ordered-triplet-ii
4+
*/
5+
export function maximumTripletValue(nums: number[]): number {
6+
const n = nums.length;
7+
8+
let answer = 0;
9+
let maxI = Math.max(nums[0], nums[1]);
10+
let maxDiff = nums[0] - nums[1];
11+
for (let k = 2; k < n; k++) {
12+
answer = Math.max(answer, maxDiff * nums[k]);
13+
maxDiff = Math.max(maxDiff, maxI - nums[k]);
14+
maxI = Math.max(maxI, nums[k]);
15+
}
16+
return answer;
17+
}

0 commit comments

Comments
 (0)