본문 바로가기

Java/Java 알고리즘 LeetCode

[LeetCode- Ch.1 문자열] 3. 라이센스 키 포맷 (+ StringBuilder.insert(위치,문자))

반응형

https://leetcode.com/problems/license-key-formatting/submissions/

 

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

class Solution {
    public String licenseKeyFormatting(String s, int k) {
        //뒤에서부터 k개수만큼 자르고 사이에 '-' 문자 추가하기
        //소문자일 경우 대문자로 변경
        
        //1.ds
        //모든 '-'문자 제거하기
        s=s.toUpperCase();
        StringBuilder sb = new StringBuilder();
        
        for(char x: s.toCharArray()){
            if(x=='-') continue;
            else sb.append(x);
        }
        s=sb.toString();
        System.out.println("raw"+" "+s);
        
        //2.loop
        int n=s.length();
        sb = new StringBuilder();
        int cnt=0;
        char[] arr = s.toCharArray();
        
        for(int i=n-1;i>=0;i--){
            if(cnt==k) {
                sb.append('-');
                sb.append(arr[i]);
                cnt=0;
            }else sb.append(arr[i]);
            
            cnt++;                        
        }
        s=sb.reverse().toString();
        return s;
    }
}

 

+) 세련된 풀이

package string;

public class LicenseKeyFormatting {
	public static String solve(String str, int k) {
		
		//1. - del
		String newStr= str.replace("-", "");
		System.out.println("1: "+newStr);
		
		//2. upper
		newStr= newStr.toUpperCase();
		System.out.println("2: "+newStr);
		
		//3. k개로 파싱하기, 그리고 - 넣기
		StringBuilder sb = new StringBuilder(newStr);
		System.out.println("3: "+newStr);
//		"8F3Z2E9W"
		int len = sb.length();
		for(int i=k; i<len; i=i+k) {
			System.out.println("len-i: "+(len-i));
			sb.insert(len-i, '-');
			System.out.println("4: "+sb);
		}
		return sb.toString();
		
	}

}

class Solution {
    public String licenseKeyFormatting(String s, int k) {
        //숫자, 문자, '-'로만 이루어진 문자열
        //첫번째 그룹을 제외하고 모든 그룹의 글자수가 K개로 형식화한다.
        //첫번째 그룹은 하나의 문자 이상을 가져야 한다.
        //모든 소문자를 대문자로 변환한다.
        
        //(1) 모든 소문자를 대문자로 변환하고, '-'를 모두 제거
        s=s.toUpperCase();
        s=s.replace("-","");
        
        //(2) 첫번째 그룹 제외하고 형식화 -> 뒤에서부터 4개씩 자른다.
        StringBuilder sb= new StringBuilder();
        
        for(int i=s.length()-1, j=1; i>=0; i--, j++){
            sb.append(s.charAt(i));
            if(j%k==0 && i!=0) {
                sb.append("-");
            }
        }
        
        return sb.reverse().toString();
    }
}

(1) sb.append(s)로 문자열을 넣고,

(2) sb.insert를 이용해 뒤에서부터 K칸마다 '-'를 넣는다.

class Solution {
    public String licenseKeyFormatting(String s, int k) {
        //숫자, 문자, '-'로만 이루어진 문자열
        //첫번째 그룹을 제외하고 모든 그룹의 글자수가 K개로 형식화한다.
        //첫번째 그룹은 하나의 문자 이상을 가져야 한다.
        //모든 소문자를 대문자로 변환한다.
        
        //(1) 모든 소문자를 대문자로 변환하고, '-'를 모두 제거
        s=s.toUpperCase();
        s=s.replace("-","");
        int n=s.length();
        
        //(2) 첫번째 그룹 제외하고 형식화 -> i=i+k
        StringBuilder sb= new StringBuilder();
        sb.append(s);
        
        //4 - 8 - 12일 때
        //length-4, length-8, length-12에 '-' 삽입
        for(int i=k; i<n; i=i+k){
            sb.insert(n-i, "-");
        }
        return sb.toString();
    }
}
반응형