From 5fdcc9961e23acfb157410f5fc58f7690742ee3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=ED=98=84?= <202580033@jei.com> Date: Thu, 20 Nov 2025 12:11:51 +0900 Subject: [PATCH 1/3] valid anagram solution --- valid-anagram/smosco.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 valid-anagram/smosco.js diff --git a/valid-anagram/smosco.js b/valid-anagram/smosco.js new file mode 100644 index 000000000..502817adb --- /dev/null +++ b/valid-anagram/smosco.js @@ -0,0 +1,33 @@ +// 시간 복잡도: O(n) - 각 문자열을 한 번씩만 순회 +// 공간 복잡도: O(1) - 최대 26개의 소문자만 저장 (상수 공간) + +/** + * @param {string} s + * @param {string} t + * @return {boolean} + */ +const isAnagram = (s, t) => { + // 길이 체크는 필수 + if (s.length !== t.length) { + return false; + } + + // 각 문자의 개수를 저장할 객체 + const charCount = {}; + + // 첫 번째 문자열의 각 문자 개수 카운트 + for (let char of s) { + charCount[char] = (charCount[char] || 0) + 1; + } + + // 두 번째 문자열의 문자를 하나씩 빼면서 확인 + for (let char of t) { + if (!charCount[char]) { + // 없는 문자거나 이미 다 사용한 경우 + return false; + } + charCount[char]--; + } + + return true; +}; From 96a4354564d1bd0a2429bdc68731ea1418fb220b Mon Sep 17 00:00:00 2001 From: smosco Date: Sat, 22 Nov 2025 21:41:32 +0900 Subject: [PATCH 2/3] climbing stairs solution --- climbing-stairs/smosco.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 climbing-stairs/smosco.js diff --git a/climbing-stairs/smosco.js b/climbing-stairs/smosco.js new file mode 100644 index 000000000..d5f6c5a81 --- /dev/null +++ b/climbing-stairs/smosco.js @@ -0,0 +1,38 @@ +/** + * 복잡도 분석: + * - 시간: O(n) - 3부터 n까지 한 번씩 순회 + * - 공간: O(1) - prev1, prev2 두 변수만 사용 + */ + +/** + * @param {number} n + * @return {number} + */ +const climbStairs = (n) => { + // 기본 케이스: 1칸이면 1가지, 2칸이면 2가지 + if (n <= 2) return n; + + /** + * 아이디어: + * n번째 계단에 도달하는 방법 = + * 1) n-1번째 계단에서 1칸 오르기 + * 2) n-2번째 계단에서 2칸 오르기 + * + * 즉, f(n) = f(n-1) + f(n-2) 피보나치 수열과 동일 + * + * 재귀로 풀면 중복 계산이 많아서 비효율적 + * → 이전 두 값만 기억하면서 반복문으로 해결 + */ + + let prev2 = 1; // f(1) = 1 + let prev1 = 2; // f(2) = 2 + + // 3부터 n까지 차례대로 계산 + for (let i = 3; i <= n; i++) { + const current = prev1 + prev2; // 현재 = 이전 + 이전의 이전 + prev2 = prev1; // 값들을 한 칸씩 앞으로 이동 + prev1 = current; + } + + return prev1; +}; From 9df34f36d4d1d9c4171b3070c45e7a4be75b0f7d Mon Sep 17 00:00:00 2001 From: smosco Date: Sat, 22 Nov 2025 21:51:24 +0900 Subject: [PATCH 3/3] product of array except self solution --- product-of-array-except-self/smosco.js | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 product-of-array-except-self/smosco.js diff --git a/product-of-array-except-self/smosco.js b/product-of-array-except-self/smosco.js new file mode 100644 index 000000000..b7d1d2920 --- /dev/null +++ b/product-of-array-except-self/smosco.js @@ -0,0 +1,39 @@ +/** + * 복잡도 분석: + * - 시간: O(n) - 배열을 두 번 순회 (왼쪽→오른쪽, 오른쪽→왼쪽) + * - 공간: O(1) - answer 배열은 출력이므로 제외, rightProduct 변수만 사용 + */ + +/** + * @param {number[]} nums + * @return {number[]} + */ +const productExceptSelf = (nums) => { + const n = nums.length; + const answer = new Array(n); + + /** + * 아이디어: + * answer[i] = (i 왼쪽 모든 요소의 곱) × (i 오른쪽 모든 요소의 곱) + * + * 예시: [1, 2, 3, 4] + * - 왼쪽 곱: [1, 1, 2, 6] + * - 오른쪽 곱: [24, 12, 4, 1] + * - 결과: [24, 12, 8, 6] + */ + + // 1단계: 왼쪽에서 오른쪽으로 순회하며 왼쪽 곱 저장 + answer[0] = 1; // 첫 번째는 왼쪽에 아무것도 없으므로 1 + for (let i = 1; i < n; i++) { + answer[i] = answer[i - 1] * nums[i - 1]; // 이전까지의 곱 × 이전 요소 + } + + // 2단계: 오른쪽에서 왼쪽으로 순회하며 오른쪽 곱을 곱해줌 + let rightProduct = 1; // 오른쪽 곱을 누적할 변수 + for (let i = n - 1; i >= 0; i--) { + answer[i] *= rightProduct; // 왼쪽 곱 × 오른쪽 곱 + rightProduct *= nums[i]; // 다음 순회를 위해 현재 요소 곱함 + } + + return answer; +};