막무가내로 삽질하는 알고리즘

LicenseKeyFormatting

Jungsoomin :) 2020. 10. 18. 22:20
  • 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