diff --git a/climbing-stairs/mike2ox.ts b/climbing-stairs/mike2ox.ts index 9c485ef68..720a385f6 100644 --- a/climbing-stairs/mike2ox.ts +++ b/climbing-stairs/mike2ox.ts @@ -1,12 +1,27 @@ +/** + * Source: https://leetcode.com/problems/climbing-stairs/description/ + * 요점: 동적 프로그래밍(DP) 접근법 - 피보나치 수열과 유사 + * 풀이 시간: 25분 + * 시간복잡도: O(n) - 마지막 결과값을 얻기위해 n번 반복 + * 공간복잡도: O(1) - 상수 공간만 사용 + */ function climbStairs(n: number): number { - let result = 0; - let step1 = 1; - let step2 = 0; + // 엣지 케이스를 사전에 처리(가지치기) + if (n <= 0) return 0; + if (n === 1) return 1; - for (let i = 0; i < n; i++) { - result = step1 + step2; - step2 = step1; - step1 = result; + // 피보나치 수열 계산을 위한 변수 + let current = 1; // n=1일 때 방법의 수 (첫 번째 피보나치 수) + let prev = 1; // n=0일 때 방법의 수 (초기값) + let temp; // 교환을 위한 임시 변수 + + // i는 2부터 시작하여 n까지 반복 + for (let i = 2; i <= n; i++) { + // 현재 계단에 도달하는 방법의 수 = 이전 두 계단에 도달하는 방법의 수의 합 + temp = current; + current = current + prev; + prev = temp; } - return result; + + return current; } diff --git a/valid-anagram/mike2ox.ts b/valid-anagram/mike2ox.ts index 773b06c72..d656acadf 100644 --- a/valid-anagram/mike2ox.ts +++ b/valid-anagram/mike2ox.ts @@ -1,4 +1,43 @@ +/** + * Source: https://leetcode.com/problems/valid-anagram/ + * 요점: 두 문자열이 애너그램인지 확인하는 함수 + * 풀이 시간: 5분 + * 풀이방법: 문자열을 정렬하여 비교하는 방법과 문자 빈도수를 카운팅하는 방법 + * 시간복잡도: O(n log n) - 정렬이 지배적인 연산 + * 공간복잡도: O(n) - 문자열을 배열로 변환하기 위한 공간 + */ function isAnagram(s: string, t: string): boolean { if (s.length !== t.length) return false; return s.split("").sort().join() === t.split("").sort().join(); } + +/** + * Solution2: 자료구조 Map을 사용해서 문자 빈도를 계산해 두 문자열이 애너그램인지 확인하기 + * 풀이 시간: 23분 + * 시간복잡도: O(n) - 단일 순회로 해결 + * 공간복잡도: O(1) - 최대 26개 알파벳에 대한 고정 크기 맵 사용 + */ +function isAnagram2(s: string, t: string): boolean { + // 길이가 다르면 애너그램이 될 수 없음 + if (s.length !== t.length) return false; + + // 각 문자의 출현 빈도를 기록할 목적으로 Map을 사용 + const charCount = new Map(); + + // 첫 번째 문자열의 각 문자 빈도 증가 + for (const char of s) { + charCount.set(char, (charCount.get(char) || 0) + 1); + } + + // 두 번째 문자열의 각 문자 빈도 감소 + for (const char of t) { + const count = charCount.get(char); + + // 문자가 없거나 빈도가 0이면 애너그램이 아님 + if (count === undefined || count === 0) return false; + + charCount.set(char, count - 1); + } + + return true; +}