Skip to content

Commit 03ded85

Browse files
authored
Merge pull request DaleStudy#800 from Yjason-K/main
[gomgom22] Week3
2 parents d754bb7 + a2ac1b0 commit 03ded85

File tree

4 files changed

+138
-0
lines changed

4 files changed

+138
-0
lines changed

β€Ž3sum/Yjason-K.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
* μ„Έ 수의 합이 0이 λ˜λŠ” λͺ¨λ“  κ³ μœ ν•œ 쑰합을 μ°ΎλŠ” ν•¨μˆ˜
3+
*
4+
* @param {number[]} nums - μ •μˆ˜ λ°°μ—΄
5+
* @returns {number[][]} - μ„Έ 수의 합이 0이 λ˜λŠ” μ‘°ν•© λ°°μ—΄
6+
*
7+
* 1. μž…λ ₯ λ°°μ—΄ `nums`λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬.
8+
* 2. 이쀑 λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ 각 μš”μ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ `투 포인터(two-pointer)`λ₯Ό μ΄μš©ν•΄ 쑰합을 탐색.
9+
* 3. 쀑볡 쑰합을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ `Set`을 μ‚¬μš©ν•˜μ—¬ κ²°κ³Ό μ‘°ν•©μ˜ λ¬Έμžμ—΄μ„ μ €μž₯.
10+
* 4. 쑰건에 λ§žλŠ” 쑰합을 `result` 배열에 μΆ”κ°€ν•©λ‹ˆλ‹€.
11+
*
12+
* μ‹œκ°„ λ³΅μž‘λ„:
13+
* - μ •λ ¬: O(n log n)
14+
* - 이쀑 반볡문 및 투 포인터: O(n^2)
15+
* - 전체 μ‹œκ°„ λ³΅μž‘λ„: O(n^2)
16+
*
17+
* 곡간 λ³΅μž‘λ„:
18+
* - `Set` 및 `result` 배열에 μ €μž₯λ˜λŠ” 고유 μ‘°ν•©: O(k), kλŠ” κ³ μœ ν•œ μ‘°ν•©μ˜ 수
19+
* - 전체 곡간 λ³΅μž‘λ„: O(n + k)
20+
*/
21+
function threeSum(nums: number[]): number[][] {
22+
const sumSet = new Set<string>();
23+
const result: number[][] = [];
24+
nums.sort((a, b) => a - b);
25+
26+
// 첫 번째 μš”μ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ 반볡문 μˆ˜ν–‰
27+
for (let i = 0; i < nums.length - 2; i++) {
28+
// μ •λ ¬ 된 μƒνƒœμ΄κΈ° λ•Œλ¬Έμ— μ‹œμž‘μ μ„ κΈ°μ€€μœΌλ‘œ λ‹€μŒ κ°’ 쀑볡 비ꡐ
29+
if (i > 0 && nums[i] === nums[i - 1]) continue;
30+
31+
let start = i + 1, end = nums.length - 1;
32+
while (start < end) {
33+
const sum = nums[i] + nums[start] + nums[end];
34+
if (sum > 0) {
35+
end--;
36+
} else if (sum < 0) {
37+
start++;
38+
} else {
39+
const triplet = [nums[i], nums[start], nums[end]];
40+
const key = triplet.toString();
41+
if (!sumSet.has(key)) {
42+
sumSet.add(key);
43+
result.push(triplet);
44+
}
45+
start++;
46+
end--;
47+
}
48+
}
49+
}
50+
51+
return result;
52+
}
53+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* μ£Όμ–΄μ§„ λ°°μ—΄μ—μ„œ μžμ‹ μ˜ 인덱슀λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μš”μ†Œλ“€μ˜ 곱을 κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜
3+
*
4+
* @param {number[]} nums - μ •μˆ˜ λ°°μ—΄
5+
* @returns {number[]} - 각 인덱슀의 μš”μ†Œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μš”μ†Œλ“€μ˜ 곱을 κ΅¬ν•œ λ°°μ—΄
6+
*
7+
* 1. κ²°κ³Ό λ°°μ—΄ `result`λ₯Ό 1둜 μ΄ˆκΈ°ν™”.
8+
* 2. μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ μˆœνšŒν•˜λ©° `left` 값을 μ΄μš©ν•΄ κΈ°μ€€ idx μ΄μ „μ˜ 값을 κ³„μ‚°ν•˜μ—¬ `result`에 μ €μž₯.
9+
* 3. 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ μˆœνšŒν•˜λ©° `right` 값을 μ΄μš©ν•΄ μ ‘λ―Έ κΈ°μ€€ idx μ΄ν›„μ˜ 값듀을 계산 νžˆμ•Ό `result`에 곱함.
10+
* 4. κ²°κ³Ό λ°°μ—΄ `result`λ₯Ό λ°˜ν™˜.
11+
*
12+
* μ‹œκ°„ λ³΅μž‘λ„:
13+
* - μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½ 순회: O(n)
14+
* - 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½ 순회: O(n)
15+
* - 전체 μ‹œκ°„ λ³΅μž‘λ„: O(n)
16+
*
17+
* 곡간 λ³΅μž‘λ„:
18+
* - μΆ”κ°€ λ°°μ—΄ 없이 μƒμˆ˜ 곡간 μ‚¬μš© (resultλŠ” 문제의 μš”κ΅¬ 쑰건에 ν¬ν•¨λ˜μ§€ μ•ŠμŒ).
19+
* - 전체 곡간 λ³΅μž‘λ„: O(1)
20+
*/
21+
function productExceptSelf(nums: number[]): number[] {
22+
const numLength = nums.length;
23+
const result = new Array(numLength).fill(1);
24+
25+
let left = 1;
26+
for (let i = 0; i < numLength; i++) {
27+
result[i] *= left;
28+
left *= nums[i];
29+
}
30+
31+
let right = 1;
32+
for (let i = numLength; i >= 0; i--) {
33+
result[i] *= right;
34+
right *= nums[i];
35+
}
36+
37+
return result;
38+
}

β€Žreverse-bits/Yjason-K.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* μ£Όμ–΄μ§„ μ •μˆ˜λ₯Ό 32λΉ„νŠΈλ‘œ λ³€ν™˜ν•˜κ³  λ°˜μ „μ‹œμΌœ κ·Έλ•Œμ˜ μ •μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” 문제.
3+
*
4+
* @param {number} n - μ •μˆ˜ (32λΉ„νŠΈ))
5+
* @returns {number} - 2μ§„μˆ˜ λ³€ν™˜ 및 λ°˜μ „ν•˜μ—¬ μ •μˆ˜ λ³€ν™˜.
6+
*
7+
* λ‚΄μž₯ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 32λΉ„νŠΈ 2μ§„μˆ˜ λ³€ν™˜ ν›„, reverseν•˜μ—¬ λ‹€μ‹œ μ •μˆ˜λ‘œ λ³€ν™˜.
8+
*
9+
* μ‹œκ°„ λ³΅μž‘λ„: O(32)
10+
* - 32λΉ„νŠΈ μ •μˆ˜μ˜ λΉ„νŠΈλ₯Ό μ²˜λ¦¬ν•˜λ―€λ‘œ κ³ μ •λœ μƒμˆ˜ μ‹œκ°„.
11+
*
12+
* 곡간 λ³΅μž‘λ„: O(32)
13+
* - 2μ§„μˆ˜ λ¬Έμžμ—΄μ„ μƒμ„±ν•˜κ³  λ°˜μ „λœ λ¬Έμžμ—΄μ„ μ €μž₯ν•˜λ―€λ‘œ κ³ μ •λœ 크기의 μΆ”κ°€ λ©”λͺ¨λ¦¬κ°€ ν•„μš”.
14+
*/
15+
function reverseBits(n: number): number {
16+
// 숫자λ₯Ό 32λΉ„νŠΈ 2μ§„μˆ˜ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ (μ•žμ— 0 μ±„μš°κΈ°)
17+
const binaryStr = n.toString(2).padStart(32, '0');
18+
// 2μ§„μˆ˜ λ¬Έμžμ—΄μ„ λ’€μ§‘κΈ°
19+
const reversedBinaryStr = binaryStr.split('').reverse().join('');
20+
// λ’€μ§‘νžŒ 2μ§„μˆ˜ λ¬Έμžμ—΄μ„ λ‹€μ‹œ 숫자둜 λ³€ν™˜
21+
return parseInt(reversedBinaryStr, 2);
22+
};

β€Žtwo-sum/Yjason-K.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* μ£Όμ–΄μ§„ λ°°μ—΄μ—μ„œ 두 숫자의 합이 target이 λ˜λŠ” idx μŒμ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
3+
* - μ‹œκ°„ λ³΅μž‘λ„: O(n)
4+
* - ν•œλ²ˆμ˜ 배열을 μˆœνšŒν•˜λ©° Map에 값을 μ €μž₯ν•˜κ³ , Mapμ—μ„œ 값을 찾음
5+
* - 곡간 λ³΅μž‘λ„: O(n)
6+
* - μˆ«μžμ™€ κ·Έλ•Œμ˜ idxλ₯Ό μŒμœΌλ‘œν•˜λŠ” Map
7+
*
8+
* @param {number[]} nums - 숫자 λ°°μ—΄
9+
* @param {number} target - νƒ€κ²Ÿ ν•©
10+
* @returns {number[]} - 합을 λ§Œλ“€ 수 μžˆλŠ” idx λ°°μ—΄
11+
*/
12+
function twoSum(nums: number[], target: number): number[] {
13+
const map = new Map<number, number>();
14+
for (let i = 0; i < nums.length; i++) {
15+
const cur = nums[i]; // ν˜„μž¬ κ°’
16+
const reamin = target - cur; // λ‚˜λ¨Έμ§€
17+
if (map.has(reamin)) {
18+
// Non-null assertion operator(!)λ₯Ό μ‚¬μš©ν•˜μ—¬ undefinedκ°€ μ•„λ‹˜μ„ 단언
19+
return [map.get(reamin)!, i];
20+
}
21+
// λ‚˜λ¨Έμ§€λ₯Ό μ°Ύμ§€ λͺ»ν•œ 경우 ν˜„μž¬ 값을 μ €μž₯
22+
map.set(cur, i);
23+
}
24+
return []; // λͺ©ν‘œ 합을 λ§Œλ“€ 수 μžˆλŠ” μˆ«μžκ°€ μ—†λŠ” 경우 빈 λ°°μ—΄ λ°˜ν™˜
25+
}

0 commit comments

Comments
Β (0)