diff --git a/longest-repeating-character-replacement/leehyeyun.js b/longest-repeating-character-replacement/leehyeyun.js new file mode 100644 index 0000000000..b41e8deb3f --- /dev/null +++ b/longest-repeating-character-replacement/leehyeyun.js @@ -0,0 +1,81 @@ +/** + * @param {string} s + * @param {number} k + * @return {number} + */ +/* +문제 설명: +주어진 문자열 s와 정수 k가 주어진다. + +문자열 s는 대문자 영어 알파벳(A~Z)으로만 구성되어 있으며, +문자열의 길이는 최대 100,000이다. + +하나의 연산에서는 문자열 s의 임의의 문자 하나를 선택하여 +다른 어떤 대문자 알파벳 문자로든 변경할 수 있다. +이 연산은 최대 k번까지 수행할 수 있다. + +목표는 연산을 최대 k번까지 수행한 후, +모든 문자가 동일한 가장 긴 연속 부분 문자열(substring)의 길이를 구하는 것이다. + +여기서 부분 문자열은 반드시 연속된 문자들로 이루어져야 하며, +문자열의 일부를 건너뛸 수는 없다. + +입력: +- s: 대문자 영어 알파벳으로 이루어진 문자열 +- k: 수행 가능한 최대 문자 변경 횟수 +- 1 ≤ s.length ≤ 100,000 +- 0 ≤ k ≤ s.length + +출력: +- 최대 k번의 문자 변경을 통해 만들 수 있는 + 모든 문자가 같은 가장 긴 연속 부분 문자열의 길이 + +예시 1: +입력: + s = "ABAB", k = 2 +설명: + 두 문자를 변경하여 "AAAA" 또는 "BBBB"로 만들 수 있다. +출력: + 4 + +예시 2: +입력: + s = "AABABBA", k = 1 +설명: + 한 문자를 변경하여 연속된 "BBBB" 부분 문자열을 만들 수 있다. +출력: + 4 + +주의 사항: +- 변경은 반드시 최대 k번까지만 가능하다. +- 최종적으로 선택한 부분 문자열은 + 모든 문자가 동일해야 한다. +*/ + +var characterReplacement = function(s, k) { + let left = 0; + let maxLen = 0; + let count = {}; + let maxCount = 0; + + for (let right = 0; right < s.length; right++) + { + const char = s[right]; + count[char] = (count[char] || 0) + 1; + + maxCount = Math.max(maxCount, count[char]); + + while ((right - left + 1) - maxCount > k) { + count[s[left]]--; + left++; + } + + maxLen = Math.max(maxLen, right - left + 1); + } + + return maxLen; +}; + +console.log(characterReplacement("ABAB",2)) +console.log(characterReplacement("AABABBA",1)) + diff --git a/reverse-bits/leehyeyun.js b/reverse-bits/leehyeyun.js new file mode 100644 index 0000000000..0277da6558 --- /dev/null +++ b/reverse-bits/leehyeyun.js @@ -0,0 +1,65 @@ +/** + * @param {number} n + * @return {number} + */ +/* +문제 설명: +주어진 32비트 부호 있는 정수 n의 비트 순서를 뒤집는 문제이다. + +n은 항상 32비트 이진수로 취급되며, +가장 오른쪽 비트는 가장 왼쪽으로, +가장 왼쪽 비트는 가장 오른쪽으로 이동한다. +즉, 32개의 비트 전체를 기준으로 순서를 완전히 반전시킨다. + +이때 숫자의 크기나 부호가 아니라, +고정된 32비트 이진 표현 자체를 기준으로 처리해야 하며 +앞쪽에 있는 0 비트도 반드시 포함된다. + +입력: +- n: 32비트 부호 있는 정수 +- 0 ≤ n ≤ 2³¹ − 2 +- n은 항상 짝수이다. + +출력: +- n의 32비트 이진 표현을 뒤집은 값을 정수로 반환한다. + +예시 1: +입력: + n = 43261596 +이진 표현: + 00000010100101000001111010011100 +비트 순서 반전: + 00111001011110000010100101000000 +출력: + 964176192 + +예시 2: +입력: + n = 2147483644 +이진 표현: + 01111111111111111111111111111100 +비트 순서 반전: + 00111111111111111111111111111110 +출력: + 1073741822 + +추가 조건 (Follow up): +- 이 함수가 매우 자주 호출되는 상황을 가정하고, + 성능을 최적화할 수 있는 방법을 고려해야 한다. +*/ + +var reverseBits = function(n) { + + const binaryString = n.toString(2).padStart(32, "0"); + const splitString = binaryString.toString().split(""); + const reverseArray = splitString.reverse(); + const joinArray = reverseArray.join(""); + const value = parseInt(joinArray, 2); + + return value; + +}; + +console.log(reverseBits(43261596)) +console.log(reverseBits(2147483644)) +