diff --git a/longest-substring-without-repeating-characters/krokerdile.js b/longest-substring-without-repeating-characters/krokerdile.js new file mode 100644 index 000000000..84ce8af21 --- /dev/null +++ b/longest-substring-without-repeating-characters/krokerdile.js @@ -0,0 +1,23 @@ +/** + * @param {string} s + * @return {number} + */ +var lengthOfLongestSubstring = function(s) { + let start = 0; + let maxLength = 0; + const seen = new Map(); // 문자 -> 마지막 인덱스 + + for (let end = 0; end < s.length; end++) { + const char = s[end]; + + // 중복 문자가 이전에 등장했으면 start를 갱신 + if (seen.has(char) && seen.get(char) >= start) { + start = seen.get(char) + 1; + } + + seen.set(char, end); // 현재 문자 위치 갱신 + maxLength = Math.max(maxLength, end - start + 1); + } + + return maxLength; +}; diff --git a/number-of-islands/krokerdile.js b/number-of-islands/krokerdile.js new file mode 100644 index 000000000..84ce8af21 --- /dev/null +++ b/number-of-islands/krokerdile.js @@ -0,0 +1,23 @@ +/** + * @param {string} s + * @return {number} + */ +var lengthOfLongestSubstring = function(s) { + let start = 0; + let maxLength = 0; + const seen = new Map(); // 문자 -> 마지막 인덱스 + + for (let end = 0; end < s.length; end++) { + const char = s[end]; + + // 중복 문자가 이전에 등장했으면 start를 갱신 + if (seen.has(char) && seen.get(char) >= start) { + start = seen.get(char) + 1; + } + + seen.set(char, end); // 현재 문자 위치 갱신 + maxLength = Math.max(maxLength, end - start + 1); + } + + return maxLength; +}; diff --git a/reverse-linked-list/krokerdile.js b/reverse-linked-list/krokerdile.js new file mode 100644 index 000000000..fcedfb799 --- /dev/null +++ b/reverse-linked-list/krokerdile.js @@ -0,0 +1,24 @@ +/** + * Definition for singly-linked list. + * function ListNode(val, next) { + * this.val = (val===undefined ? 0 : val) + * this.next = (next===undefined ? null : next) + * } + */ +/** + * @param {ListNode} head + * @return {ListNode} + */ +function reverseList(head) { + let prev = null; + let curr = head; + + while (curr !== null) { + let nextTemp = curr.next; + curr.next = prev; + prev = curr; + curr = nextTemp; + } + + return prev; // prev는 새로운 head +} diff --git a/set-matrix-zeroes/krokerdile.js b/set-matrix-zeroes/krokerdile.js new file mode 100644 index 000000000..73245b1e8 --- /dev/null +++ b/set-matrix-zeroes/krokerdile.js @@ -0,0 +1,57 @@ +/** + * @param {number[][]} matrix + * @return {void} Do not return anything, modify matrix in-place instead. + */ +var setZeroes = function(matrix) { + const m = matrix.length; + const n = matrix[0].length; + + let firstRowHasZero = false; + let firstColHasZero = false; + + // 첫 행/열에 0이 있는지 확인 + for (let i = 0; i < m; i++) { + if (matrix[i][0] === 0) firstColHasZero = true; + } + for (let j = 0; j < n; j++) { + if (matrix[0][j] === 0) firstRowHasZero = true; + } + + // 마커로 0 표시 + for (let i = 1; i < m; i++) { + for (let j = 1; j < n; j++) { + if (matrix[i][j] === 0) { + matrix[i][0] = 0; // 해당 행 마킹 + matrix[0][j] = 0; // 해당 열 마킹 + } + } + } + + // 마커 기반으로 행/열 0 처리 + for (let i = 1; i < m; i++) { + if (matrix[i][0] === 0) { + for (let j = 1; j < n; j++) { + matrix[i][j] = 0; + } + } + } + for (let j = 1; j < n; j++) { + if (matrix[0][j] === 0) { + for (let i = 1; i < m; i++) { + matrix[i][j] = 0; + } + } + } + + // Step 4: 첫 행과 첫 열 처리 + if (firstRowHasZero) { + for (let j = 0; j < n; j++) { + matrix[0][j] = 0; + } + } + if (firstColHasZero) { + for (let i = 0; i < m; i++) { + matrix[i][0] = 0; + } + } +}; diff --git a/unique-paths/krokerdile.js b/unique-paths/krokerdile.js new file mode 100644 index 000000000..3e73cd86d --- /dev/null +++ b/unique-paths/krokerdile.js @@ -0,0 +1,21 @@ +/** + * @param {number} m + * @param {number} n + * @return {number} + */ +var uniquePaths = function(m, n) { + const memo = {}; + + function dfs(x, y) { + if (x >= m || y >= n) return 0; + if (x === m - 1 && y === n - 1) return 1; + + const key = `${x},${y}`; + if (key in memo) return memo[key]; + + memo[key] = dfs(x + 1, y) + dfs(x, y + 1); + return memo[key]; + } + + return dfs(0, 0); +};