알고리즘 문제 풀이

[LeetCode] 482. License Key Formatting

_OB1N 2021. 9. 8. 11:35

문제 출처: 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