https://leetcode.com/problems/license-key-formatting/
You are given a license key represented as a string s that consists of only alphanumeric characters and dashes. The string is separated into n + 1 groups by n dashes. You are also given an integer k.
We want to reformat the string s such that each group contains exactly k characters, except for the first group, which could be shorter than k but still must contain at least one character. Furthermore, there must be a dash inserted between two groups, and you should convert all lowercase letters to uppercase.
Return the reformatted license key.
s consists of English letters, digits, and dashes '-'.
문제를 제대로 파악하지 못해서 해맸다. 첫 그룹의 단어를 유지하고 나머지 그룹들을 K개씩 끊는 것이라고 생각했는데, 알고보니 처음 그룹의 단어길이는 상관없고 끝에서 부터 체킹하는 것이 문제였다. 문제의 예시와 설명이 부족한 것 같다. 끝에서부터 인덱스를 체킹하고 K씩 건너뛰는데 문자열을 '-'없애고 대문자 처리를 먼저 해준뒤에 StringBuilder로 만들어서 insert()메서드로 인덱스 사이사이에 '-'를 추가해준다. 단 이렇게하면 StringBuilder의 길이가 동적으로 변하므로 알맞은 인덱스 이동이 불가능하다. 그래서 최초의 길이를 미리 변수에 담아서 사용한다.
class Solution {
public String licenseKeyFormatting(String s, int k) {
s = s.replace("-", "").toUpperCase();
StringBuilder sb = new StringBuilder(s);
// sb.insert로 길이가 동적으로 변하므로 최초 길이를 변수에 담아 사용해야 한다
// '-'를 추가하고 그 앞의 경우만 인덱스 범위에 포함되므로 전체길이가 변해도 영향 없다
int len = sb.length();
// 처음 그룹은 길이의 제한이 없고 끝에서 부터 K개를 지켜야 하므로 끝에서부터 인덱스 시작
// 끝에서 부터 K개씩 세어서 사이에 '-'를 넣어줌, 0번째 인덱스는 '-' 들어가면 안되므로 제외
for (int i = len-k; i > 0; i -= k) {
sb.insert(i, '-');
}
return sb.toString();
}
}