Skip to content

Commit 9ccd6eb

Browse files
authored
Merge pull request #2044 from BaeKwangho/main
[dev_qorh] WEEK 02 solutions
2 parents d155e31 + e0715a4 commit 9ccd6eb

File tree

4 files changed

+291
-0
lines changed

4 files changed

+291
-0
lines changed

โ€Ž3sum/Baekwangho.tsโ€Ž

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/**
2+
ํ•ฉ์‚ฐ์ด 0์ด ๋˜๋Š” ์„œ๋กœ์†Œ ์กฐํ•ฉ์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.. ์ขŒํ‘œ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ™์€ ๊ฐ’์€ ํ—ˆ์šฉํ•˜๋˜,
3+
๊ฐ™์€ ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ์กฐํ•ฉ์€ ์ค‘๋ณต์„ ๋ถˆํ—ˆํ•œ๋‹ค.
4+
5+
๊ธฐ๋ณธ์ ์œผ๋กœ 3๊ฐ€์ง€ ์ˆ˜๋ฅผ ์ค‘๋ณต์—†์ด ์กฐํ•ฉํ•ด์„œ ๋ฝ‘์€ ๋‹ค์Œ, ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ set ์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?
6+
7+
8+
function threeSum(nums: number[]): number[][] {
9+
const arraySet = new Set<string>();
10+
11+
for (let i = 0; i <= nums.length - 3; i++) {
12+
for (let j = i + 1; j <= nums.length - 2; j++) {
13+
for (let k = j + 1; k <= nums.length - 1; k++) {
14+
if (nums[i] + nums[j] + nums[k] === 0) {
15+
const sorted = [nums[i], nums[j], nums[k]];
16+
sorted.sort((a, b) => a - b);
17+
const string = sorted.join("#");
18+
arraySet.add(string);
19+
}
20+
}
21+
}
22+
}
23+
24+
return Array.from(arraySet).map((el) =>
25+
el.split("#").map((el) => Number(el))
26+
);
27+
}
28+
*/
29+
30+
/**
31+
์‹œ๊ฐ„ ์ดˆ๊ณผํ•ด๋ฒ„๋ ธ๋‹ค. ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ์„๊นŒ?
32+
two sum ์„ ๋ณด๋‹ˆ ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์“ด๋‹ค๊ณ  ํ•œ๋‹ค. nums ๋ฅผ ํ•ด์‹œํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜ํ•˜๊ณ ,
33+
์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์—์„œ ์ด๋ฅผ ํ™œ์šฉํ•ด๋ณด์ž.
34+
35+
function threeSum(nums: number[]): number[][] {
36+
const arraySet = new Set<string>();
37+
const hash = new Map<number, number[]>();
38+
nums.forEach((val, idx) => {
39+
const idxes = hash.get(val);
40+
if (idxes && idxes.length) {
41+
hash.set(val, [...idxes, idx]);
42+
} else {
43+
hash.set(val, [idx]);
44+
}
45+
});
46+
47+
for (let i = 0; i < nums.length - 2; i++) {
48+
for (let j = i + 1; j < nums.length - 1; j++) {
49+
const idxes = hash.get(0 - (nums[i] + nums[j]));
50+
51+
idxes?.forEach((idx) => {
52+
if (idx != i && idx != j) {
53+
const sorted = [nums[i], nums[j], nums[idx]];
54+
sorted.sort((a, b) => a - b);
55+
const string = sorted.join("#");
56+
arraySet.add(string);
57+
}
58+
});
59+
}
60+
}
61+
62+
return Array.from(arraySet).map((el) =>
63+
el.split("#").map((el) => Number(el))
64+
);
65+
}
66+
67+
*/
68+
69+
/**
70+
... 0์œผ๋กœ๋งŒ ๊ฐ€๋“์ฐฌ ๋ฐฐ์—ด์—์„œ time limit ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.
71+
ํ’€์ด๋ฅผ ๋ณด๊ณ ์˜ค๋‹ˆ, ์œ„ ๋กœ์ง์—์„œ 0์œผ๋กœ ๊ฐ€๋“์ฐฌ arraySet ์„ ์ˆœํšŒํ•˜๋Š” ๊ณณ์—์„œ ๊ฒฐ๊ตญ O(n^3) ์ด ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค๋Š” ์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
72+
ํ™•์‹คํ•œ ๊ฒƒ์€, ์ •๋ ฌ์„ ์ถ”๊ฐ€ํ–ˆ์„ ๊ฒฝ์šฐ ์œ„ ๋กœ์ง๋„ ํ†ต๊ณผ ๊ฐ€๋Šฅํ•œ ์ •๋„๋กœ ๋งŒ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ์‹ถ์—ˆ๋‹ค.
73+
74+
function threeSum(nums: number[]): number[][] {
75+
nums.sort((a, b) => a - b);
76+
const arraySet = new Set<string>();
77+
const hash = new Map<number, number[]>();
78+
79+
nums.forEach((val, idx) => {
80+
const idxes = hash.get(val);
81+
if (idxes && idxes.length) {
82+
hash.set(val, [...idxes, idx]);
83+
} else {
84+
hash.set(val, [idx]);
85+
}
86+
});
87+
88+
for (let i = 0; i < nums.length - 2; i++) {
89+
for (let j = i + 1; j < nums.length - 1; j++) {
90+
const idxes = hash.get(0 - (nums[i] + nums[j])) ?? [];
91+
92+
for (let k = 0; k < idxes.length; k++) {
93+
const idx = idxes[k];
94+
if (idx != i && idx != j) {
95+
const sorted = [nums[i], nums[j], nums[idx]];
96+
sorted.sort((a, b) => a - b);
97+
const string = sorted.join("#");
98+
arraySet.add(string);
99+
100+
break;
101+
}
102+
}
103+
}
104+
}
105+
106+
return Array.from(arraySet).map((el) =>
107+
el.split("#").map((el) => Number(el))
108+
);
109+
}
110+
111+
๊ทผ๋ฐ ์–ด๋–ป๊ฒŒ๋“  ๋ชป๋งŒ๋“ฆ.
112+
*/
113+
114+
/**
115+
์–ด์ œ ํ•ด๋‹ต์„ ๋ณด์•˜์œผ๋‹ˆ, ๋‹ค์‹œํ•œ๋ฒˆ ํ’€์–ด๋ณด์ž.
116+
ํ•ต์‹ฌ์€ ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ, ์ž๋ฃŒ๊ตฌ์กฐ์— ์–ฝ๋ฉ”์ด์ง€ ์•Š๋Š” ๊ฒƒ
117+
*/
118+
119+
function threeSum(nums: number[]): number[][] {
120+
nums.sort((a, b) => a - b);
121+
const results = [];
122+
123+
// [-4, -1, -1, 0, 1, 2]
124+
for (let i = 0; i < nums.length; i++) {
125+
while (nums[i - 1] === nums[i]) i++;
126+
127+
let low = i + 1;
128+
let high = nums.length - 1;
129+
while (low < high) {
130+
const sum = nums[i] + nums[low] + nums[high];
131+
if (sum < 0) {
132+
low++;
133+
} else if (sum > 0) {
134+
high--;
135+
} else {
136+
while (nums[high] === nums[high - 1]) high--;
137+
while (nums[low] === nums[low + 1]) low++;
138+
results.push([nums[i], nums[low], nums[high]]);
139+
low++;
140+
high--;
141+
}
142+
}
143+
}
144+
145+
return results;
146+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
4์™€ 5๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•˜๋ฉด
3+
4+
1+1+1+1
5+
1+1+2
6+
1+2+1
7+
2+1+1
8+
2+2
9+
=> 5
10+
11+
1+1+1+1+1
12+
1+1+1+2
13+
1+1+2+1
14+
1+2+1+1
15+
2+1+1+1
16+
1+2+2
17+
2+1+2
18+
2+2+1
19+
=> 8
20+
21+
์™œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ๊ฐ™์„๊นŒ? ์ผ๋‹จ ๊ทธ๋ ‡๊ฒŒ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด๋ณด์ž.
22+
23+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
24+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
25+
26+
๊ทผ๋ฐ ์™œ ํ”ผ๋ณด๋‚˜์น˜์ธ์ง€๋Š” ์ƒ๊ฐํ•ด๋ณด๊ณ  ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ..
27+
*/
28+
29+
function climbStairs(n: number): number {
30+
if (n === 1) {
31+
return 1;
32+
}
33+
34+
if (n === 2) {
35+
return 2;
36+
}
37+
38+
const results = [1, 2];
39+
for (let i = 2; i < n; i++) {
40+
results.push(results[i - 2] + results[i - 1]);
41+
}
42+
43+
return results.pop() as number;
44+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/**
2+
[์ฒซ๋ฒˆ์งธ ์‹œ๋„]
3+
O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ, i ๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ์ œ๊ณฑ ์ˆ˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
4+
nums ๋ฅผ ์ขŒ์šฐ์—์„œ ์ˆœํšŒํ•˜๋ฉฐ, result += nums[i]^2 or nums[n-i]^2 ๋ฅผ ์ด์–ด ๋‚˜๊ฐ€๋˜,
5+
๋‘ ๋ฐฐ์—ด์„ ๋”ํ•˜๋Š” ์‹œ์ ์—์„œ nums ์˜ ๋ฐฐ์—ด ๊ฐ’์„ ๋บด์ฃผ๋ฉด?
6+
7+
... ๋ฌธ์ œ๋ฅผ ์ž˜๋ชป ์ดํ•ดํ•ด์„œ ํ•ฉ์ธ ์ค„ ์•Œ์•˜๋‹ค.. ๊ณฑ์ด๊ตฌ๋‚˜ ๋‚˜๋ˆ—์…ˆ ์—†์ด ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ•œ๋‹ด
8+
9+
์ผ๋‹จ nums ์— 0์ด ๋‘๊ฐœ ์žˆ์œผ๋ฉด ์ •๋‹ต ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ˆ˜๋Š” 0์ด๋‹ค.
10+
๊ทธ ์™ธ์—๋Š” ๊ณฑ์…ˆ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š”๋ฐ..
11+
12+
๋‘ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ, ์ „์ฒด ์ˆ˜ ๊ณฑ ํ–‰๋ ฌ์„ ๋งŒ๋“ค์–ด ๋ณด์ž => ์‹คํŒจ
13+
14+
์ˆ˜์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด๋ฉด?
15+
16+
f(n) = n๋ฒˆ์งธ ์ˆ˜ ์ œ์™ธ ์ „์ฒด ๊ณฑ
17+
f(0) = f(1) * ... * f(n)
18+
f(1) = f(0) * f(2) * ... * f(n)
19+
f(n-1) = f(0) * ... * f(n-2) * f(n)
20+
21+
๋ชจ๋ฅด๊ฒ ๋‹ค.. ์˜ค๋Š˜์€ ํ•ด์„ค ๋ณด๊ณ  ๋‚ด์ผ ๊ธฐ์–ตํ•ด์„œ ํ’€์–ด๋ณด์ž
22+
function productExceptSelf(nums: number[]): number[] {
23+
const forward = [nums[0]];
24+
const backward = [nums[nums.length - 1]];
25+
26+
for (let i = 1; i < nums.length; i++) {
27+
forward.push(forward[i - 1] * nums[i]);
28+
backward.push(backward[i - 1] * nums[nums.length - 1 - i]);
29+
}
30+
31+
const result = [];
32+
for (let i = 0; i < nums.length - 1; i++) {
33+
result.push(forward[i] * backward[i]);
34+
}
35+
36+
return result;
37+
}
38+
39+
*/
40+
/**
41+
[๋‘๋ฒˆ์งธ ์‹œ๋„]
42+
์ ‘๊ทผ์€ ๋งž์•˜๋‹ค. ๊ฒฐ๊ตญ ์ œ๋Œ€๋กœ ์ˆ˜์‹์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋“ฏ
43+
์ˆ˜์‹์„ ์ž‘์„ฑํ•ด๋ณด๋ฉด,
44+
forward ๋Š” [1, 2, 2*3, 2*3*4]
45+
backward ๋Š” [3*4*5, 4*5, 5, 1] ๊ฐ€ ๋‚˜์™€์•ผ ํ•œ๋‹ค.
46+
47+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(2n)
48+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(3n)
49+
*/
50+
51+
function productExceptSelf(nums: number[]): number[] {
52+
const forward = [1]
53+
const backward = [1]
54+
for (let i=0; i<nums.length-1; i++) {
55+
forward.push(nums[i] * forward[i])
56+
backward.push(nums[nums.length-1-i] * backward[i])
57+
58+
}
59+
60+
const result = []
61+
for (let i=0; i<nums.length; i++){
62+
result.push(forward[i] * backward[nums.length-1-i])
63+
}
64+
65+
return result
66+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
๊ฐ ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ, ๊ธ€์ž๋ณ„๋กœ ๋“ฑ์žฅํ•œ ํšŸ์ˆ˜๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์„ ๋“ฏ ํ•˜๋‹ค.
3+
s ๋ฅผ ๋จผ์ € ์ˆœํšŒํ•˜์—ฌ ์ƒ์„ฑํ•œ map ์— ๋Œ€ํ•ด t ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ map ์„ ์†Œ๊ฑฐ์‹œ์ผœ๋ณด์ž
4+
5+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
6+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(log n) (๋ฌธ์ž์—ด ์ˆ˜๋ฅผ ๊ธฐ์ค€)
7+
*/
8+
9+
function isAnagram(s: string, t: string): boolean {
10+
const wordMap = new Map<string, number>();
11+
for (let i = 0; i < s.length; i++) {
12+
const value = wordMap.get(s[i])
13+
if (value) {
14+
wordMap.set(s[i], value + 1);
15+
} else {
16+
wordMap.set(s[i], 1);
17+
}
18+
}
19+
20+
for (let i = 0; i < t.length; i++) {
21+
const remainWord = wordMap.get(t[i]);
22+
if (remainWord) {
23+
24+
if (remainWord > 1) {
25+
wordMap.set(t[i], remainWord - 1);
26+
} else if (remainWord === 1) {
27+
wordMap.delete(t[i]);
28+
}
29+
} else {
30+
return false;
31+
}
32+
}
33+
34+
return wordMap.size === 0 ? true : false;
35+
}

0 commit comments

Comments
ย (0)