[TIL] 문자열 압축하기

·2023년 3월 8일
0

알고리즘

목록 보기
6/11
post-thumbnail

문제

알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.

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


입력값

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

KSTTTSEEKFKKKDJJGG

출력값

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

KST3SE2KFK3DJ2G2


해결 방법

  1. 입력받은 문자열을 순회하면서 i번째 인덱스 값을 가진 문자와 i+1번째 인덱스 값을 가진 문자를 비교한다.
    1-1. 중복되는 문자의 개수를 체크하기 위해 count = 1로 선언한다.
  2. i번째 문자와 i+1번째 문자가 같다면, count값에 1을 더해준다.
  3. i번째 문자와 i+1번째 문자가 같지 않다면, 결과값에 해당 문자를 추가한다.
  4. count값이 2 이상이라면 결과 값에 count 값을 문자로 변경하여 추가한다.
  5. count값을 1로 초기화하고 다음 순회를 진행한다.

첫 번째 코드

class Main {
    public String solution(String str) {
        int count = 1;
        String result = "";

        // str를 순회하면서 tmp와 같으면 count++,
        // 같지않으면 현재 문자를 result에 저장하고, count가 2이상일 경우 같이 저장
        // 공백이 포함되어 있으므로 그 전까지만 순회한다.
        for(int i = 0; i<str.length()-1; i++) {
            if(str.charAt(i) == str.charAt(i+1)) {
                count++;
            } else {
                result += str.charAt(i);
                if(count > 1) {
                    result += count;
                    count = 1;
                }
            }
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        Main T = new Main();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        String answer = T.solution(str);

        System.out.println(answer);

    }
}

💡 출력값이 KST3SE2KFK3DJ2G2이 아닌KST3SE2KFK3DJ2 마지막 문자가 생략되는 문제가 발생하였다. 마지막 문자는 비교할 대상이 없어서 나타나는 문제였다.

두 번째 코드

class Main {
    public String solution(String str) {
        int count = 1;
        String result = "";
        // 마지막 문자는 비교할 대상이 없으므로 임의의 공백을 넣어준다.
        str += " ";

        for(int i = 0; i<str.length()-1; i++) {
            if(str.charAt(i) == str.charAt(i+1)) {
                count++;
            } else {
                result += str.charAt(i);
                if(count > 1) {
                    result += count;
                    count = 1;
                }
            }
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        Main T = new Main();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        String answer = T.solution(str);

        System.out.println(answer);

    }
}

입력 받은 문자열에 임의의 공백을 두어, 마지막 문자가 생략되어도 출력에 문제가 없도록 하였다.

또한, 문자열의 마지막 문자는 다음 문자가 없어 StringIndexOutOfBoundsException가 발생하므로 문자열의 마지막 문자의 인덱스 전까지 순회하도록 하였다.

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글