diff --git a/raejun/FirstBadVersion.js b/raejun/FirstBadVersion.js new file mode 100644 index 0000000..887c01c --- /dev/null +++ b/raejun/FirstBadVersion.js @@ -0,0 +1,47 @@ +/** + * Definition for isBadVersion() + * + * @param {integer} version number + * @return {boolean} whether the version is bad + * isBadVersion = function(version) { + * ... + * }; + */ + +/** + * @param {function} isBadVersion() + * @return {function} + */ +var solution = function (isBadVersion) { + /** + * @param {integer} n Total versions + * @return {integer} The first bad version + */ + return function (n) { + let start = 1; + let end = n; + + while (start <= end) { + const mid = Math.floor((start + end) / 2); + + if (isBadVersion(mid)) { + if (!isBadVersion(mid - 1)) return mid; + + end = mid; + } else start = mid + 1; + } + }; +}; + +/* +22분 걸림. + +시간 복잡도는 O(log n)이다. n은 버전의 수이다. + +1을 start로 n을 end로 두고 이진 탐색으로 풀이했다. + +이진 탐색을 통해 특정한 값을 찾는 것만에 익숙해져 있어, 반복문 전에 start와 end가 isBadVersion이면 return을 하는 실수를 했다. +이진 탐색을 사용하는데 계속 시간 초과가 났다. 지피티한테 물어보니 start = mid에 +1을 해줘야 한다고 한다. +만약 start = 1, end = 2일 때 mid = 1이 된다. 만약 1이 bad version이라면 end = mid가 되어서 end도 1이 된다. 그러면 start와 end가 둘 다 1이 되어서 무한 루프에 빠지는 것이다. +이진탐색에서 범위를 확실히 줄이려면 +1, -1을 해줘야 한다. +*/ diff --git a/raejun/RansomNote.js b/raejun/RansomNote.js new file mode 100644 index 0000000..555ceed --- /dev/null +++ b/raejun/RansomNote.js @@ -0,0 +1,45 @@ +/** + * @param {string} ransomNote + * @param {string} magazine + * @return {boolean} + */ +var canConstruct = function (ransomNote, magazine) { + const map = new Map(); + + for (const char of ransomNote) { + if (map.has(char)) { + map.set(char, map.get(char) + 1); + } else { + map.set(char, 1); + } + } + + for (let i = 0; i < magazine.length; i++) { + const char = magazine[i]; + + if (map.has(char)) { + if (map.get(char) === 1) { + map.delete(char); + } else { + map.set(char, map.get(char) - 1); + } + } + + if (map.size === 0) return true; + } + + return false; +}; + +/* +21분 걸림. + +시간 복잡도는 O(n)이다. n은 magazine의 길이이다. + +ransomNote에 있는 문자들의 개수를 map에 저장한다. +magazine을 탐색하면서 map에 있는 문자들을 제거해나간다. +만약 map이 비게 되면 true를 반환한다. + +처음에 문자 개수를 상관하지 않아도 된다고 생각해서 Set으로 접근했다. +하지만, 같은 문자가 여러 개 있을 수 있기 때문에 Set으로는 풀이할 수 없었다. 그래서 Map으로 접근했다. +*/