Skip to content

Commit

Permalink
Merge pull request #375 from wogha95/main
Browse files Browse the repository at this point in the history
[์žฌํ˜ธ] WEEK 03 Solutions
  • Loading branch information
wogha95 authored Sep 1, 2024
2 parents ffade1e + 7788008 commit 8cdb2dc
Show file tree
Hide file tree
Showing 5 changed files with 238 additions and 0 deletions.
21 changes: 21 additions & 0 deletions climbing-stairs/wogha95.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// DP ํ™œ์šฉํ•˜์˜€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ถ•์†Œ๋ฅผ ์œ„ํ•ด ํ˜„์žฌ์™€ ์ง์ „์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋งŒ ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
// TC: O(N)
// SC: O(1)

/**
* @param {number} n
* @return {number}
*/
var climbStairs = function (n) {
let previousStep = 0;
let currentStep = 1;

while (n > 0) {
n -= 1;
const nextStep = previousStep + currentStep;
previousStep = currentStep;
currentStep = nextStep;
}

return currentStep;
};
23 changes: 23 additions & 0 deletions coin-change/wogha95.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// TC: O(C * A)
// SC: O(C)
// C: coins.length, A: amount

/**
* @param {number[]} coins
* @param {number} amount
* @return {number}
*/
var coinChange = function (coins, amount) {
const dp = new Array(amount + 1).fill(Number.MAX_SAFE_INTEGER);
dp[0] = 0;

for (let index = 1; index < amount + 1; index++) {
for (const coin of coins) {
if (index - coin >= 0) {
dp[index] = Math.min(dp[index - coin] + 1, dp[index]);
}
}
}

return dp[amount] === Number.MAX_SAFE_INTEGER ? -1 : dp[amount];
};
84 changes: 84 additions & 0 deletions combination-sum/wogha95.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// 2์ฐจ
// ๋ชซ์„ ํ™œ์šฉํ•˜์—ฌ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ด๊ณ ์ž ํ•˜์˜€์œผ๋‚˜ generateSubResult์—์„œ ์ถ”๊ฐ€ ์‹œ๊ฐ„๋ฐœ์ƒ์œผ๋กœ ์œ ์˜๋ฏธํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
// TC: O(C^2 * T)
// SC: O(T)
// C: candidates.length, T: target

/**
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
var combinationSum = function (candidates, target) {
const result = [];
// 'q' means 'quotient'.
const qList = candidates.map((candidate) => Math.floor(target / candidate));

dfs([], 0);

return result;

function dfs(selectedQList, total) {
if (total > target) {
return;
}

if (total === target) {
result.push(generateSubResult(selectedQList));
return;
}

const currentIndex = selectedQList.length;
for (let q = qList[currentIndex]; q >= 0; q--) {
selectedQList.push(q);
dfs(selectedQList, total + candidates[currentIndex] * q);
selectedQList.pop();
}
}

function generateSubResult(selectedQList) {
return selectedQList
.map((q, index) => new Array(q).fill(candidates[index]))
.flat();
}
};

// 1์ฐจ
// dfs๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ -> ์žฌ๊ท€ -> ์ œ๊ฑฐ -> ์žฌ๊ท€๋กœ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค.
// TC: O(C^T)
// SC: O(C)
// C: candidates.length, T: target

/**
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
var combinationSum = function (candidates, target) {
const result = [];

dfs([], 0, 0);

return result;

function dfs(subResult, total, currentIndex) {
if (total > target) {
return;
}

if (total === target) {
result.push([...subResult]);
return;
}

if (currentIndex === candidates.length) {
return;
}

const candidate = candidates[currentIndex];
subResult.push(candidate);
dfs(subResult, total + candidate, currentIndex);
subResult.pop();
dfs(subResult, total, currentIndex + 1);
}
};
59 changes: 59 additions & 0 deletions product-of-array-except-self/wogha95.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// ์ขŒ->์šฐ ๋ฐฉํ–ฅ์˜ ๋ˆ„์ ๊ณฑ๊ณผ ์šฐ->์ขŒ ๋ฐฉํ–ฅ์˜ ๋ˆ„์ ๊ณฑ ํ™œ์šฉ
// TC: O(N)
// SC: O(N) (๋‹ต์•ˆ์„ ์ œ์™ธํ•˜๋ฉด O(1))

/**
* @param {number[]} nums
* @return {number[]}
*/
var productExceptSelf = function (nums) {
const result = new Array(nums.length).fill(1);

let leftToRight = 1;
for (let index = 1; index < nums.length; index++) {
leftToRight *= nums[index - 1];
result[index] *= leftToRight;
}

let rightToLeft = 1;
for (let index = nums.length - 2; index >= 0; index--) {
rightToLeft *= nums[index + 1];
result[index] *= rightToLeft;
}

return result;
};

// 1์ฐจ ํ’€์ด
// 0์˜ ๊ฐฏ์ˆ˜๊ฐ€ 0๊ฐœ, 1๊ฐœ, 2๊ฐœ์ธ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ ์„œ ํ’€์ด
// 0๊ฐœ์ธ ๊ฒฝ์šฐ, ๋‹ต์•ˆ ๋ฐฐ์—ด์˜ ์›์†Œ๋Š” '๋ชจ๋“  ์›์†Œ ๊ณฑ / ํ˜„์žฌ ์›์†Œ'
// 1๊ฐœ์ธ ๊ฒฝ์šฐ, 0์˜ ์œ„์น˜ํ•œ ์›์†Œ๋งŒ '0์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์›์†Œ ๊ณฑ' ์ด๊ณ  ๊ทธ ์™ธ '0'
// 2๊ฐœ์ธ ๊ฒฝ์šฐ, ๋‹ต์•ˆ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์›์†Œ๊ฐ€ '0'

// TC: O(N)
// SC: O(N)

/**
* @param {number[]} nums
* @return {number[]}
*/
var productExceptSelf = function (nums) {
const zeroCount = nums.filter((num) => num === 0).length;
if (zeroCount > 1) {
return new Array(nums.length).fill(0);
}

const multipled = nums.reduce(
(total, current) => (current === 0 ? total : total * current),
1
);

if (zeroCount === 1) {
const zeroIndex = nums.findIndex((num) => num === 0);
const result = new Array(nums.length).fill(0);
result[zeroIndex] = multipled;
return result;
}

return nums.map((num) => multipled / num);
};
51 changes: 51 additions & 0 deletions two-sum/wogha95.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// 2์ฐจ: index๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” Map์„ ํ™œ์šฉํ•˜์—ฌ ํ•œ๋ฒˆ์˜ ์ˆœํšŒ๋กœ ๋‹ต์•ˆ ๋„์ถœ
// TC: O(N)
// SC: O(N)

/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
const valueIndexMap = new Map();

for (let index = 0; index < nums.length; index++) {
const value = nums[index];
const anotherValue = target - value;

if (valueIndexMap.has(anotherValue)) {
return [index, valueIndexMap.get(anotherValue)];
}

valueIndexMap.set(value, index);
}
};

// 1์ฐจ: ์ •๋ ฌ ํ›„ ํˆฌํฌ์ธํ„ฐ ํ™œ์šฉ
// TC: O(N * logN)
// SC: O(N)

/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
const sortedNums = nums
.map((value, index) => ({ value, index }))
.sort((a, b) => a.value - b.value);
let left = 0;
let right = sortedNums.length - 1;

while (left < right) {
const sum = sortedNums[left].value + sortedNums[right].value;
if (sum < target) {
left += 1;
} else if (sum > target) {
right -= 1;
} else {
return [sortedNums[left].index, sortedNums[right].index];
}
}
};

0 comments on commit 8cdb2dc

Please sign in to comment.