[LeetCode] 482. License Key Formatting
문제 출처: https://leetcode.com/problems/license-key-formatting/
License Key Formatting - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
문제
오직 알파벳 문자와 대시(-)로만 구성되어 있는 라이선스 키 문자열 $s$가 주어진다. 이 라이센스 키 문자열은 $n$개의 대쉬로 인해 $n+1$개의 그룹으로 구분되어 있다. 라이선스 키와 더불어 한 개의 정수 $k$가 주어진다.
라이센스 키 문자열을 첫 그룹을 제외한 나머지 그룹이 정확히 $k$개의 문자를 갖는 형태로 재구성하고자 한다. 첫 그룹은 $k$보다 작거나 같은 수의 문자를 가져야 하지만, 최소 한 개의 문자는 포함해야 한다. 추가적으로 두 그룹 사이에는 대시가 삽입되어야 하고, 모든 문자를 대문자로 변경해야 한다.
재구성된 라이센스 키를 반환하라.
예제
Input: s = "5F3Z-2e-9-w", k = 4
Output: "5F3Z-2E9W"
Explanation: The string s has been split into two parts, each part has 4 characters.
Note that the two extra dashes are not needed and can be removed.
Input: s = "2-5g-3-J", k = 2
Output: "2-5G-3J"
Explanation: The string s has been split into three parts, each part has 2 characters except the first part as it could be shorter as mentioned above.
풀이
이 문제는 문자열 처리에 대해 물어보는 문제라고 생각합니다.
우선적으로 입력으로 들어오는 라이선스 키의 대시(-)는 필요가 없기 때문에 모든 대시를 제거하는 작업을 우선적으로 수행하였습니다. 또한 출력으로 모든 알파벳들이 대문자로 변형되어야 하기 때문에 이 작업 또한 동시에 진행하였습니다.
var licenseKeyFormatting = function(s, k) {
// 대시(-) 제거 및 대문자 변환
s = s.replaceAll('-', '').toUpperCase();
}
이 과정이 지나고 나면 라이센스 키 문자열은 숫자 또는 알파벳만 오로지 남아 있을 것이며, 알파벳은 대문자로 작성되어 있을 것이다.
예 1) "5F3Z-2e-9-w" => "5F3Z2E9W"
예 2) "2-5g-3-J" => "25G3J"
이제 첫 그룹을 제외한 나머지 그룹이 $k$개의 문자를 갖게 만들어야 한다. 그룹화를 하기 위해서 첫 그룹에 몇 개의 문자가 할당되어야 나머지 그룹이 온전히 $k$개의 문자를 갖게 되는지 알기 위해서 나머지 연산(modulo, %)을 통해 알아낼 수 있다.
예 1) "5F3Z2E9W", k = 4
- 라이선스 키의 문자 수: 8
- 첫 그룹의 문자 개수: 8 % 4 = 0 (=> 4)
예 2) "25G3J", k = 2:
- 라이선스 키의 문자 수: 5
- 첫 그룹의 문자 개수: 5 % 2 = 1
※ 나머지 연산을 수행하게 되면 $[0, k-1]$ 범위의 값을 얻게 되는데, 이 값이 0이라는 것은 모든 그룹이 $k$개의 문자를 가질 수 있다는 의미이므로 첫 그룹의 문자 수가 $k$로 설정되어야 한다.
var licenseKeyFormatting = function(s, k) {
// 대시(-) 제거 및 대문자 변환
s = s.replaceAll('-', '').toUpperCase();
// 첫 그룹의 문자 수 계산
const cntFrist = s.length % k ? s.length % k : k;
}
첫 그룹에 몇 개의 문자가 할당되어야 하는지 알았기 때문에, 해당 개수의 문자를 첫 그룹에 할당하고 이후부터 $k$개씩 끊어서 그룹화하여 라이선스 키의 모든 그룹을 구할 수 있다.
최종적으로 각 그룹 사이에 대시를 삽입하여 반환한다.
var licenseKeyFormatting = function(s, k) {
// 대시(-) 제거 및 대문자 변환
s = s.replaceAll('-', '').toUpperCase();
// 첫 그룹의 문자 수 계산
const cntFrist = s.length % k ? s.length % k : k;
// 그룹화 진행
const keyGroup = [s.slice(0, cntFrist)];
let i = cntFrist;
while ( i+k <= s.length ) {
keyGroup.push(s.slice(i, i+k));
i += k;
}
// 각 그룹 사이에 대시(-) 삽입
return keyGroup.join('-');
}
Github: 482.js
GitHub - opwe37/Algorithm-Study
Contribute to opwe37/Algorithm-Study development by creating an account on GitHub.
github.com