Skip to content

Commit 154c742

Browse files
authored
[seongmin36] WEEK 03 Solutions (#2715)
* valid palindrome solution * number of 1 bits solution * combination sum solution * decode ways solution * maximum subarray solution
1 parent 86d5e72 commit 154c742

5 files changed

Lines changed: 167 additions & 0 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
๋ฐฑํŠธ๋ž˜ํ‚น(backtracking)์„ ์ด์šฉํ•œ ํ’€์ด
3+
4+
candidates ๋ฐฐ์—ด์ด ์ˆœ์ฐจ ์ •๋ ฌ์„ ์œ„ํ•ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
5+
ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” backtracking(๋‚จ์€ ์ˆ˜, ํ˜„์žฌ push๋œ ๋ฐฐ์—ด, ํƒ์ƒ‰ํ•œ ์ธ๋ฑ์Šค)๋ฅผ ๋ฐ›๋Š”๋‹ค.
6+
7+
๋™์ž‘ ์›๋ฆฌ
8+
1. candidates์˜ ์ž‘์€ ์›์†Œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ pushํ•˜๊ณ , ํ•ด๋‹น ์›์†Œ๋ฅผ target์—์„œ ์ฐจ๊ฐํ•œ๋‹ค โ†’ remains
9+
2. dfs ๋ฐฉ์‹์œผ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ remains๊ฐ€ 0์ด ๋˜๋ฉด ์ตœ์ข… result ๋ฐฐ์—ด์— push๋œ๋‹ค.
10+
3. ์—ฌ๊ธฐ์„œ breakpoint๋Š” ํƒ์ƒ‰ ์ธ๋ฑ์Šค์˜ ๊ฐ’์ด remains๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์ด๋‹ค.
11+
4. ๊ฐ€์žฅ ํ•ต์‹ฌ์ธ ๋ถ€๋ถ„์€ ์›๋ณธ ๋ฐฐ์—ด์— find_number/remains๋ฅผ ์กฐํ•ฉํ•  ์ˆ˜ ์—†์œผ๋ฉด pop()์„ ํ˜ธ์ถฃํ•˜๋Š”๋ฐ,
12+
์ด๋Š” ์ง„ํ–‰์ค‘์ธ ๋‹จ๊ณ„์—์„œ ๋” ์ด์ƒ์˜ ์กฐํ•ฉ์„ ์ฐพ์ง€ ๋ชปํ•ด์„œ ๋‹ค์Œ ์กฐํ•ฉ์„ ์ฐพ๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๊ณผ์ •์ด๋‹ค.
13+
*/
14+
/**
15+
* @param {number[]} candidates
16+
* @param {number} target
17+
* @return {number[][]}
18+
*/
19+
function combinationSum(candidates, target) {
20+
let result = [];
21+
22+
candidates.sort((a, b) => a - b);
23+
24+
function backtracking(remains, current, index) {
25+
if (remains === 0) {
26+
result.push([...current]);
27+
}
28+
29+
for (let i = index; i < candidates.length; i++) {
30+
let find_number = remains - candidates[i];
31+
32+
if (candidates[i] > remains) break;
33+
34+
current.push(candidates[i]);
35+
backtracking(find_number, current, i);
36+
current.pop();
37+
}
38+
}
39+
40+
backtracking(target, [], 0);
41+
42+
return result;
43+
}

โ€Ždecode-ways/seongmin36.jsโ€Ž

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
๊ฒ€์ฆํ•ด์•ผ๋˜๋Š” ์ผ€์ด์Šค๋Š” ์ด 2๊ฐ€์ง€๋‹ค.
3+
1. 1~9๊นŒ์ง€์˜ ์•ŒํŒŒ๋ฒณ
4+
2. 10~26๊นŒ์ง€์˜ ์•ŒํŒŒ๋ฒณ
5+
6+
์šฐ์„  ๋งจ ์•ž์ž๋ฆฌ๊ฐ€ '0'์ธ ๊ฒฝ์šฐ๋Š” ํ•ญ์ƒ 0์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ๋‹ค.
7+
substring() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ s๋กœ๋ถ€ํ„ฐ ํŠน์ • ๋ฒ”์œ„์˜ string์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.
8+
1์ž๋ฆฌ์ผ ๋•Œ(one_char), 2์ž๋ฆฌ์ผ ๋•Œ(two_char) ์ผ€์ด์Šค๋ฅผ ๋น„๊ตํ•œ๋‹ค.
9+
10+
์ค‘์š”ํ•œ ์ ์€ '๋น„๊ตํ•œ ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•ด์•ผํ•˜๋Š”๊ฐ€?'์ด๋‹ค.
11+
์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ, 'climbing stairs'(ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด)์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ '๋ฐ”ํ…€์—… ๋ฐฉ์‹์˜ DP'๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
12+
๋ฐ”ํ…€์—… DP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€์˜ ์ผ€์ด์Šค์˜ ํ•ฉ์„ ๊ธฐ์–ตํ•˜๊ณ  ๋”ํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
13+
*/
14+
15+
/**
16+
* @param {string} s
17+
* @return {number}
18+
*/
19+
function numDecodings(s) {
20+
if (s[0] === "0") return 0;
21+
22+
let dp = new Array(s.length + 1).fill(0);
23+
24+
dp[0] = 1;
25+
26+
function isAlphabet(str) {
27+
if (str.length === 1) return str >= "1" && str <= "9";
28+
if (str.length === 2) return str >= "10" && str <= "26";
29+
30+
return false;
31+
}
32+
33+
for (let i = 1; i < dp.length; i++) {
34+
let one_char = s.substring(i - 1, i);
35+
let two_char = s.substring(i - 2, i);
36+
37+
if (isAlphabet(one_char)) {
38+
dp[i] += dp[i - 1];
39+
}
40+
if (i >= 2) {
41+
if (isAlphabet(two_char)) {
42+
dp[i] += dp[i - 2];
43+
}
44+
}
45+
}
46+
return dp[s.length];
47+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ์—ฐ๊ฒฐ๋œ ๋ฐฐ์—ด์ด์–ด์•ผ ํ•˜๊ณ , ๋ˆ„์ ๋œ ๊ฐ’์˜ ํ•ฉ์ด ์Œ์ˆ˜๋ผ๋ฉด ๊ณผ๊ฐํ•˜๊ฒŒ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
3+
์ด๋ฅผ ์นด๋ฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Kadane's Algorithm)์ด๋ผ๊ณ  ํ•œ๋‹ค.
4+
*/
5+
6+
/**
7+
* @param {number[]} nums
8+
* @return {number}
9+
*/
10+
function maxSubArray(nums) {
11+
let result = nums[0];
12+
let cur_sum = nums[0];
13+
14+
if (nums.length === 1) return nums[0];
15+
16+
for (let i = 1; i < nums.length; i++) {
17+
if (cur_sum <= 0) {
18+
cur_sum = nums[i];
19+
} else if (cur_sum > 0) {
20+
cur_sum = cur_sum + nums[i];
21+
}
22+
23+
result = Math.max(result, cur_sum);
24+
}
25+
return result;
26+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
toString(2)์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค๊ฐ€ ๋‹ค๋ฅธ ๋ถ„์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๋‹ค์‹œ ํ’€์–ด๋ณด์•˜๋‹ค.
3+
4+
'๋น„ํŠธ ์—ฐ์‚ฐ์„ ํ†ตํ•œ ๊ณ„์‚ฐ'์ด๋‹ค.
5+
์ปดํ“จํ„ฐ์—์„œ ๋ชจ๋“  ์–ธ์–ด๋Š” 2์ง„๋ฒ•์œผ๋กœ ๋ณ€ํ™˜์ด ๋˜๋Š”๋ฐ, ์ด๋ฅผ ์ด์šฉํ•œ ํ”Œ์ด๋‹ค.
6+
๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋น„ํŠธ๊ฐ€ 1์ธ ๊ฒฝ์šฐ์— count++, n์„ ์šฐ์ธก์œผ๋กœ 1์นธ shift.
7+
shift๋ฅผ ํ•˜๋ฉด ๊ฒฐ๊ตญ ๋‚จ๋Š” ์ˆซ์ž๋Š” 0์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ ์กฐ๊ฑด์œผ๋กœ ๋ฃจํ”„๋ฅผ ๋น ์ ธ๋‚˜์˜จ๋‹ค.
8+
9+
๊ตณ์ด 2์ง„๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ด๊ฒŒ ๋” ์ข‹์€ ํ’€์ด๋ผ ์ƒ๊ฐํ•˜์˜€๋‹ค.
10+
*/
11+
/**
12+
* @param {number} n
13+
* @return {number}
14+
*/
15+
function hammingWeight(n) {
16+
let count = 0;
17+
18+
while (n !== 0) {
19+
count += n & 1;
20+
n >>>= 1;
21+
}
22+
23+
return count;
24+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
s๋ฅผ ์ •๊ทœ์‹์œผ๋กœ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž string๋งŒ ๋‚จ๊ฒจ๋‘ฌ์•ผํ•œ๋‹ค.
3+
์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋งŒ ๋‚จ๊ฒจ๋†“๋„๋ก ํ•˜๋Š” ์ •๊ทœ์‹์€ '/[^a-z0-9]/gi'์ด๋‹ค.
4+
left(0)์™€ right(๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค)๋ฅผ ๋™์‹œ์— ํ•˜๋‚˜์”ฉ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ๋น„๊ต
5+
*/
6+
7+
/**
8+
* @param {string} s
9+
* @return {boolean}
10+
*/
11+
function isPalindrome(s) {
12+
s = s.replace(/[^a-z0-9]/gi, "").toLowerCase();
13+
14+
let left = 0;
15+
let right = s.length - 1;
16+
17+
while (left < right) {
18+
if (s[left] !== s[right]) {
19+
return false;
20+
}
21+
22+
left++;
23+
right--;
24+
}
25+
26+
return true;
27+
}

0 commit comments

Comments
ย (0)