diff --git a/best-time-to-buy-and-sell-stock/byol-han.js b/best-time-to-buy-and-sell-stock/byol-han.js new file mode 100644 index 000000000..cf86e59b1 --- /dev/null +++ b/best-time-to-buy-and-sell-stock/byol-han.js @@ -0,0 +1,18 @@ +/** + * @param {number[]} prices + * @return {number} + */ +var maxProfit = function (prices) { + let minPrice = Infinity; + let maxProfit = 0; + + for (let i = 0; i < prices.length; i++) { + if (prices[i] < minPrice) { + minPrice = prices[i]; // 지금까지 가장 싼 날 + } else if (prices[i] - minPrice > maxProfit) { + maxProfit = prices[i] - minPrice; // 현재 이익이 최대 이익보다 클 때 maxProfit 갱신 + } + } + + return maxProfit; +}; diff --git a/group-anagrams/byol-han.js b/group-anagrams/byol-han.js new file mode 100644 index 000000000..896624d1c --- /dev/null +++ b/group-anagrams/byol-han.js @@ -0,0 +1,21 @@ +/** + * @param {string[]} strs + * @return {string[][]} + */ +var groupAnagrams = function (strs) { + const map = new Map(); + + for (let str of strs) { + // 문자열을 정렬해서 key로 사용 + const key = str.split("").sort().join(""); + + // key가 이미 있다면 배열에 추가, 없으면 새로 생성 + if (!map.has(key)) { + map.set(key, []); + } + map.get(key).push(str); + } + + // 값만 모아서 배열로 반환 + return Array.from(map.values()); +}; diff --git a/word-break/byol-han.js b/word-break/byol-han.js new file mode 100644 index 000000000..8ac85564b --- /dev/null +++ b/word-break/byol-han.js @@ -0,0 +1,29 @@ +/** + * https://leetcode.com/problems/word-break/ + * @param {string} s + * @param {string[]} wordDict + * @return {boolean} + */ +var wordBreak = function (s, wordDict) { + const wordSet = new Set(wordDict); + const dp = new Array(s.length + 1).fill(false); + dp[0] = true; // 빈 문자열은 항상 true + + for (let i = 1; i <= s.length; i++) { + for (let j = 0; j < i; j++) { + if (dp[j] && wordSet.has(s.substring(j, i))) { + dp[i] = true; + break; + } + } + } + + return dp[s.length]; +}; + +/* +Set은 검색이 빠르다 +wordDict가 배열이면, includes()로 단어가 있는지 찾을 때 O(n) 시간이 걸림 +하지만 Set을 사용하면 has() 메서드로 단어가 있는지 O(1) 시간이 걸림 +이 차이는 s.length가 길거나 wordDict가 클수록 성능에 큰 영향 +*/