Skip to content
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

[YeomChaeeun] Week 2 #721

Merged
merged 6 commits into from
Dec 22, 2024
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
42 changes: 42 additions & 0 deletions 3sum/YeomChaeeun.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/**
* 세 숫자의 합이 0이 되는 조합 찾기
* 알고리즘 복잡도:
* - 시간복잡도: O(n^2)
* - 공간복잡도: O(1)
* @param nums
*/
function threeSum(nums: number[]): number[][] {
// 정렬
nums.sort((a, b) => a - b)
let result: number[][] = []

// 투포인터
for (let i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] === nums[i - 1]) continue;

let start = i + 1
let end = nums.length - 1
const target = -nums[i] // 고정 숫자를 이용
// start + end + target === 0 이므로, start + end === -target

while (start < end) {
const sum = nums[start] + nums[end]
if (sum === target) {
result.push([nums[i], nums[start], nums[end]])

// 배열 중복 값 건너뛰기
while (start < end && nums[start] === nums[start + 1]) start++
while (start < end && nums[start] === nums[end - 1]) end--

// 포인터 이동
start++
end--
} else if (sum < target) {
start++
} else {
end--
}
}
}
return result
}
26 changes: 26 additions & 0 deletions climbing-stairs/YeomChaeeun.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* 계단 오르기
* 알고리즘 복잡도:
* - 시간복잡도: O(n) - 입력값 크기에 비례하는 단일 반복문
* - 공간복잡도: O(1) - 상수 개의 변수만 사용
* @param n
*/
function climbStairs(n: number): number {
// 1 - 2 - 3 - 5 - 8 ... 규칙 발생
if(n <= 3) return n

// 접근 (1) - 시간복잡도가 너무 큼
// return climbStairs(n - 1) + climbStairs(n - 2) // 시간

// 접근 (2)
// 피보나치 수열과 비슷한 앞의 두 숫자를 더해서 배열 구조를 만듬
let current = 1; // 현재 방법
let prev = 1; // 이전 단계의 방법

// n-1번 반복하여 계산
for (let i = 1; i < n; i++) {
[current, prev] = [current + prev, current];
}

return current;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
/**
* 이진트리 만들기
* 알고리즘 복잡도:
* - 시간복잡도: O(n^2)
* - 공간복잡도: O(n^2)
*/
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
// 전위 순회(preorder): 최상위 노드 -> 좌측 서브트리 -> 우측 서브트리
// 중위 순회(inorder): 좌측 서브트리 -> 최상위 노드 -> 우측 서브트리

// 재귀적으로 호출하기 위해 배열이 비었을때 null을 반환하며 종료시킴
if (preorder.length === 0 || inorder.length === 0) {
return null
}

let root = preorder[0]
let mid = inorder.findIndex((value) => value === root)

let leftInorder = inorder.slice(0, mid)
let rightInorder = inorder.slice(mid+1)

let leftPreorder = preorder.slice(1, 1 + leftInorder.length)
let rightPreorder = preorder.slice(1 + leftInorder.length)

let left = buildTree(leftPreorder, leftInorder)
let right = buildTree(rightPreorder, rightInorder)

return new TreeNode(root, left, right)
}
24 changes: 24 additions & 0 deletions valid-anagram/YeomChaeEun.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/**
* 알고리즘 복잡도:
* - 시간복잡도: O(n)
* - 공간복잡도: O(k)
* @param s
* @param t
*/
function isAnagram(s: string, t: string): boolean {
if(s.length !== t.length) return false

let counter = {}
for(let sValue of s) {
if(!counter[sValue]) { counter[sValue] = 1 }
else { counter[sValue]++ }

}

for(let tValue of t) {
if(!counter[tValue]) return false
else counter[tValue]--
}

return Object.values(counter).findIndex(value => value !== 0) < 0;
}
Loading