Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions climbing-stairs/smosco.js
Original file line number Diff line number Diff line change
@@ -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;
};
39 changes: 39 additions & 0 deletions product-of-array-except-self/smosco.js
Original file line number Diff line number Diff line change
@@ -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;
};
33 changes: 33 additions & 0 deletions valid-anagram/smosco.js
Original file line number Diff line number Diff line change
@@ -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;
};