diff --git a/climbing-stairs/seueooo.js b/climbing-stairs/seueooo.js new file mode 100644 index 0000000000..e858292818 --- /dev/null +++ b/climbing-stairs/seueooo.js @@ -0,0 +1,23 @@ +/** + * @param {number} n + * @return {number} + * + * 풀이 + * 1. dp를 사용하여 각 계단까지 올라갈 수 있는 방법의 수를 계산한다. + * 2. dp[i]는 i번째 계단까지 올라갈 수 있는 방법의 수를 나타낸다. + * 3. dp[i] = dp[i - 1] + dp[i - 2] : 마지막에 한 번에 1계단을 올라온 경우와 2계단을 올라온 경우를 합친다. + * 시간 복잡도 - O(n) : 배열을 한 번 순회 + * 공간 복잡도 - O(n) : dp 배열 생성 + */ +var climbStairs = function (n) { + let dp = []; + dp[0] = 0; + dp[1] = 1; + dp[2] = 2; + + for (let i = 3; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + + return dp[n]; +}; diff --git a/product-of-array-except-self/seueooo.js b/product-of-array-except-self/seueooo.js new file mode 100644 index 0000000000..5dad52040c --- /dev/null +++ b/product-of-array-except-self/seueooo.js @@ -0,0 +1,29 @@ +/** + * 풀이 + * 1. prefix는 현재 인덱스까지의 곱을 저장하고, suffix는 현재 인덱스 이후의 곱을 저장한다. + * 2. 첫 번째 반복문에서 prefix를 계산하고, 두 번째 반복문에서 suffix를 계산하여 answer 배열에 곱한다. + * 시간 복잡도 - O(n) : 배열을 두 번 순회 + * 공간 복잡도 - O(1) : answer 배열 + * + * @param {number[]} nums + * @return {number[]} + */ +var productExceptSelf = function (nums) { + let prefix = 1; + let suffix = 1; + const n = nums.length; + let answer = new Array(n).fill(1); + + // 순방향 + for (let i = 0; i < n; i++) { + answer[i] = prefix; + prefix *= nums[i]; + } + + // 역방향 + for (let i = n - 1; i >= 0; i--) { + answer[i] *= suffix; + suffix *= nums[i]; + } + return answer; +}; diff --git a/valid-anagram/seueooo.js b/valid-anagram/seueooo.js new file mode 100644 index 0000000000..c17dc25141 --- /dev/null +++ b/valid-anagram/seueooo.js @@ -0,0 +1,24 @@ +/** + * 풀이 + * 1. 두 문자열의 길이가 다르면 false를 반환한다. + * 2. 첫 번째 문자열을 순회하며 각 문자의 등장 횟수를 count 객체에 저장한다. + * 3. 두 번째 문자열을 순회하며 count 객체에서 해당 문자의 등장 횟수를 감소시킨다. + * 4. 만약 count 객체에 해당 문자가 없거나 등장 횟수가 0이면 false를 반환한다. + * 5. 모든 문자를 순회한 후에도 false를 반환하지 않았다면 true를 반환한다. + * 시간 복잡도 - O(n) : 두 문자열을 한 번씩 순회 + * 공간 복잡도 - O(1) : count 객체는 최대 26개의 알파벳만 저장 + */ +var isAnagram = function (s, t) { + let count = {}; + if (s.length !== t.length) { + return false; + } + for (const i of s) { + count[i] = count[i] ? count[i] + 1 : 1; + } + for (const i of t) { + if (!count[i]) return false; + count[i]--; + } + return true; +};