Skip to content

[moonhyeok song] WEEK 02 solutions #1241

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 14, 2025
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
31 changes: 23 additions & 8 deletions climbing-stairs/mike2ox.ts
Original file line number Diff line number Diff line change
@@ -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;
}
39 changes: 39 additions & 0 deletions valid-anagram/mike2ox.ts
Original file line number Diff line number Diff line change
@@ -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<string, number>();

// 첫 번째 문자열의 각 문자 빈도 증가
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;
}