From 1d87efd797b313f199ea9de78649436366b804c7 Mon Sep 17 00:00:00 2001 From: YeomChaeeun Date: Sat, 18 Jan 2025 14:50:50 +0900 Subject: [PATCH] feat: spiral-matrix, longest-increasing-subsequence solution --- longest-increasing-subsequence/YeomChaeeun.ts | 26 +++++++++++ spiral-matrix/YeomChaeeun.ts | 43 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 longest-increasing-subsequence/YeomChaeeun.ts create mode 100644 spiral-matrix/YeomChaeeun.ts diff --git a/longest-increasing-subsequence/YeomChaeeun.ts b/longest-increasing-subsequence/YeomChaeeun.ts new file mode 100644 index 000000000..ab0039a57 --- /dev/null +++ b/longest-increasing-subsequence/YeomChaeeun.ts @@ -0,0 +1,26 @@ +/** + * 주어진 배열에서 가장 긴 부분 수열의 길이 구하기 + * 달고알레 풀이를 참고하여 동적 프로그래밍 적용했습니다 + * 알고리즘 복잡도 + * - 시간 복잡도: O(n2) + * - 공간 복잡도: O(n) + * @param nums + */ +function lengthOfLIS(nums: number[]): number { + // dp 배열을 1로 초기화 - 각 숫자 단독의 기본 길이는 1임 + const dp: number[] = new Array(nums.length).fill(1) + let maxLength = 1 + + for (let i = 1; i < nums.length; i++) { + // 현재 위치(i) 이전의 모든 원소들을 확인 + for (let j = 0; j < i; j++) { + // 현재 숫자가 이전 숫자보다 큰 경우 - 부분 수열이 가능하다는 것 + if (nums[i] > nums[j]) { + dp[i] = Math.max(dp[i], dp[j] + 1) + } + } + maxLength = Math.max(maxLength, dp[i]) + } + + return maxLength +} diff --git a/spiral-matrix/YeomChaeeun.ts b/spiral-matrix/YeomChaeeun.ts new file mode 100644 index 000000000..f62dfdb85 --- /dev/null +++ b/spiral-matrix/YeomChaeeun.ts @@ -0,0 +1,43 @@ +/** + * 달팽이 알고리즘 + * 알고리즘 복잡도 + * - 시간 복잡도: O(n) - 모든 행렬의 원소의 수 (rows * columns) + * - 공간 복잡도: O(n) - 결과 저장을 위한 배열 + * @param matrix + */ +function spiralOrder(matrix: number[][]): number[] { + // 정처기 단골 문제였던 기억이.. + const result: number[] = []; + let top = 0 + let bottom = matrix.length - 1; + let left = 0 + let right = matrix[0].length - 1; + + while(top <= bottom && left <= right) { // 순환 조건 + for(let i = left; i <= right; i++) { + result.push(matrix[top][i]) + } + top++ + + for(let i = top; i <= bottom; i++) { + result.push(matrix[i][right]) + } + right-- + + if(top <= bottom) { + for(let i = right; i >= left; i--) { + result.push(matrix[bottom][i]) + } + bottom-- + } + + if(left <= right) { + for(let i = bottom; i >= top; i--) { + result.push(matrix[i][left]) + } + left++ + } + } + + return result +}