Skip to content
Open
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
18 changes: 18 additions & 0 deletions climbing-stairs/seongmin36.js

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🏷️ 알고리즘 패턴 분석

  • 패턴: Dynamic Programming
  • 설명: 2단계 점화식으로 이전 값들 이용해 현재 값을 구하는 DP 패턴으로, 클라이밍 스테어의 경우 피보나치-like 시퀀스를 배열에 저장하며 해법을 계산합니다.

📊 시간/공간 복잡도 분석

ℹ️ 이 파일에는 3가지 풀이가 포함되어 있어 각각 분석합니다.

풀이 1: climbStairs — Time: O(n) / Space: O(n)
복잡도
Time O(n)
Space O(n)

피드백: 배열을 사용해 연속된 두 값의 합으로 계단 수를 계산한다.

개선 제안: 현재 구현이 적절해 보입니다.

풀이 2: productExceptSelf — Time: O(n) / Space: O(1)
복잡도
Time O(n)
Space O(1)

피드백: 왼쪽과 오른쪽 누적 곱을 이용해 한 번의 순회로 결과를 얻는다.

개선 제안: 현재 구현이 적절해 보입니다.

풀이 3: isAnagram — Time: O(n) / Space: O(n)
복잡도
Time O(n)
Space O(n)

피드백: 길이 검사 후 맵을 통해 각 문자 카운트를 증가/감소시키는 방식이다.

개선 제안: 현재 구현이 적절해 보입니다.

💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/**
* @param {number} n
* @return {number}
*/
function climbStairs(n) {
if (n <= 2) return n;

let arr = new Array(n + 1);

arr[0] = 1;
arr[1] = 2;

for (let i = 2; i < arr.length; i++) {
arr[i] = arr[i - 2] + arr[i - 1];
}

return arr[n - 1];
}
34 changes: 34 additions & 0 deletions product-of-array-except-self/seongmin36.js

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🏷️ 알고리즘 패턴 분석

  • 패턴: Two Pointers
  • 설명: 배열에서 두 포인터를 앞뒤로 움직이며 각 위치의 곱을 누적하는 방식으로, 이중 반복 없이 각 원소를 제외한 곱을 구한다. left와 right 두 포인터로 좌우를 관리하는 구조가 핵심이다.

Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/**
문제의 핵심은 '어떻게 인덱스와 곱을 이중 반복문을 쓰지 않고 해결하느냐'다. 'Goal' → 시간 복잡도 : O(N)
여기서 사용된 개념: 'Two Pointer'
Two Pointer? → '배열에서 순차적으로 접근해야 할 때 두 개의 점의 위치를 기록하면서 처리하는 알고리즘'
이중 반복을 사용하지 않고, 각 인덱스를 순회하면서 answer[index]에 본인을 제외한 곱셈을 중첩시킨다.
본인을 제외한 나머지 원소의 곱이기 때문에 left와 right로 나눠서 중첩된 곱셈을 다시 곱한다.
*/

/**
* @param {number[]} nums
* @return {number[]}
*/
function productExceptSelf(nums) {
let answer = new Array(nums.length).fill(1);

let left = 0;
let right = nums.length - 1;

let mul_left = 1;
let mul_right = 1;

while (left < nums.length && right >= 0) {
answer[left] *= mul_left;
mul_left *= nums[left]; // 자기 자신 제외 곱

answer[right] *= mul_right;
mul_right *= nums[right];

left++;
right--;
}

return answer;
}
31 changes: 31 additions & 0 deletions valid-anagram/seongmin36.js

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🏷️ 알고리즘 패턴 분석

  • 패턴: Hash Map / Hash Set, Two Pointers
  • 설명: 두 문자열의 문자 빈도를 해시 맵으로 카운트하고, 두 문자열를 비교하며 차감을 통해 같은지 확인하는 방식이다. 순회를 통해 각 문자 등장 횟수를 추적하므로 해시 맵 패턴이 적합하며, 변수를 하나씩 줄여가는 연산은 투 포인터 느낌도 준다.

Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/**
결국 같아야 것은 string의 길이와 안에 들어간 각 character의 갯수다.
즉, s와 t의 문자의 갯수와 같으면 된다.
map을 사용하여 key와 value자리에 각각 문자, 갯수를 받는다.
s와 t를 비교하며 해당하는 문자 갯수-1을 한다.
각 key의 value를 문제없이 차감했다면 true를 반환. 그 외 false를 반환
*/

/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
function isAnagram(s, t) {
if (s.length !== t.length) return false;

let map_s = new Map();

for (let char of s) {
map_s.set(char, (map_s.get(char) || 0) + 1);
}

for (let char of t) {
if (!map_s.has(char) || map_s.get(char) === 0) {
return false;
}
map_s.set(char, map_s.get(char) - 1);
}

return true;
}
Loading