김찬진의 개발 블로그

23/02/01 [⭐Inf_0111 문자열 압축] 본문

1일1알고/Java Algorithm

23/02/01 [⭐Inf_0111 문자열 압축]

kim chan jin 2023. 2. 1. 13:49

설명

알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는

문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.

단 반복횟수가 1인 경우 생략합니다.

 

입력

첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.

 

출력

첫 줄에 압축된 문자열을 출력한다.

 

예시 입력 1 

KKHSSSSSSSE

 

예시 출력 1

K2HS7E

 

예시 입력 2 

KSTTTSEEKFKKKDJJGG

 

예시 출력 2

KST3SE2KFK3DJ2G2

 

코드

기억할 것

버블정렬처럼 두 요소를 비교할 때에는

idx 초과를 방지하기 위해 마지막 요소는 포함시키지 않는 것(len-1)이 중요하다. ()

하지만 이 경우는 마지막 요소 자체도 검사해야 한다.

따라서 입력값에 공백문자를 추가해야 한다.

그럼 idx 초과를 방지하기 위해 마지막 요소(공백문자)는 포함시키지 않되(len-1) 마지막 요소 자체도 검사할 수 있다.

import java.util.Scanner;

public class Main {
    public String solution(String str){
        StringBuilder sb = new StringBuilder();
        str = str + " "; // 마지막 요소까지 빠짐없이 비교하기 위해 공백문자 붙이기
        int cnt = 1;

        for(int i=0; i<str.length()-1; i++){ // 마지막 요소까지 빠짐없이 비교
            if(str.charAt(i) == str.charAt(i+1)){ // 내 옆이 같은 수라면
                cnt++;
            } else{
                sb.append(str.charAt(i)); // 내 옆이 다른 수라면
                if(cnt>1){ // cnt가 1보다 크다면
                    sb.append(cnt); // sb에 cnt 붙임
                    cnt=1; // cnt=1 재설정
                }
                // cnt가 1이라면 sb에 cnt 안붙임
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        Main m = new Main();
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(m.solution(str));
    }
}
Comments