ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LeetCode] 482. License Key Formatting
    알고리즘 문제 풀이 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

     

    댓글

Designed by Tistory.