- k 만큼의 글자를 그룹화한 뒤 하이픈을 추가한다.
- 글자는 모두 대문자여야하고 , k만큼의 글자로 그룹화 되지 않는 부분은 첫 그룹에 묶는다.
- 길이 체크 후 대문자로 바꿈.
- StringBuffer 로 하이픈을 찾아 없앰
- k보다 작아 그룹화할 수 없다면 그대로 리턴
- k보다 크다면 역순으로 탐색하며 count가 k 의 배수일 때 하이픈 추가
public class LicenseKeyFormatting {
public static void main(String[] args) {
String str1 = "8F3Z-2e-9-w";
String str2 = "8-5g-3-J";
int k = 4;
String answer = solve(str2, k);
System.out.println(answer);
}
/**
* -로 하나의 그룹이 정해진다. 첫번째 그룹은 k 보다 짧아야하며 하나 이상의 문자를 포함한다. 모든 문자는 대문자로 변환한다.
*
* @param str1
* @param k
* @return
*/
private static String solve(String str1, int k) {
if (str1.length() == 0) {
return "";
}
str1 = str1.toUpperCase();
StringBuffer buffer = new StringBuffer(str1);
for (int i = 0; i < buffer.length() - 1; i++) {
if (buffer.charAt(i) == '-') {
buffer.replace(i, i + 1, "");
}
}
if (buffer.length() < k) {
return buffer.toString();
}
int count = 0;
for (int i = buffer.length() - 1; i >= 1; i--) {
++count;// 역순 탐색하고, count 증가시 마다 k 만큼 나누어 보고 맞아 떨어지면 하이픈을 추가한다.
if (count % k == 0) {
buffer.insert(i, "-");// 4 번째 인덱스에 - 삽입
}
}
return buffer.toString();
}
}
풀이
- 핵심은 k만큼 증가시키는 for 문 과 length 에서 k를 뺀 값을 알아내는 것이다.
- replace 로 해당 문자를 전부 변환가능하다.
public class LicenseKeyFormattingTeaching {
public static void main(String[] args) {
String str1 = "8F3Z-2e-9-webcdef";
String str2 = "8-5g-3-J";
int k = 2;
solve(str1, k);
}
private static void solve(String str1, int k) {
// replace는 모든 문자를 바꿔줌
String newStr = str1.replace("-", "");
newStr = newStr.toUpperCase();
//길이 14
int length = newStr.length();
StringBuilder sb = new StringBuilder(newStr);
//4, 8 , 12 만큼 증가
for(int i=k; i<newStr.length(); i=i+k){// k씩 증가함
// k씩 뺀 값을 넣는다.
sb.insert(length-i, '-');
System.out.println(length-i);
}
System.out.println(sb.toString());
}
}
'막무가내로 삽질하는 알고리즘' 카테고리의 다른 글
KClosest (0) | 2020.10.25 |
---|---|
다리를 지나는 트럭 (0) | 2020.10.19 |
JewelsAndStones (0) | 2020.10.18 |
MeetingRoom2 (0) | 2020.10.18 |
우선순위 큐 (0) | 2020.10.18 |