본문 바로가기
카테고리 없음

[Java] 문자열 압축

by codeok 2022. 6. 19.
반응형

설명

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

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

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

입력

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

출력

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

예시 입력 1 

KKHSSSSSSSE

예시 출력 1

K2HS7E

예시 입력 2 

KSTTTSEEKFKKKDJJGG

예시 출력 2

KST3SE2KFK3DJ2G2

 

 

첫 번째 풀이

문제 접근은 문자열을 압축할려면 같은 문자가 연속적으로 몇 번 반복되는지 체크를 하기 위해서 현재 문자와 다음 문자가 같다면 equalCount++ 를 증감해줬다.

 

equalCount를 1로 할당한 이유는 현재 문자는 한 번 연속된 것이라고 생각했다.

 

  • 현재 문자(currentChar)와 다음 문자(nextChar)이 같지 않으면
    • equalCount가 1이면 1일때는 압축한 문자만 answer.append() 했다.
    • 다시 연속되는 문자를 찾기 위해서 eqaulCount를 1로 할당했다.
  • 현재 문자(currentChar)와 다음 문자(nextChar)이 같으면
    • equalCount가 1이 아니라면 압축한 숫자와 문자를 answer.append() 했다.

 

하단에 끝 문자(rear)와 끝에서 두 번째 문자(secondOfRear)를 비교한 이유는 입력값 (KKHSSSE) word의 length()가 7이라면 현재 for문은 length() - 1만큼 반복해서 마지막 S까지만 비교를 하고, 끝에 문자는 추가해주지 않기에 따로 작성해줬다.

package section01.E11_문자열_압축;

import java.io.*;

public class Main {

    public String solution(String word){

        // 입력 : 대문자로 이루어진 문자열 word <= 100
        // 출력 : 압축된 문자열

        StringBuilder answer = new StringBuilder();
        int wordLength = word.length();
        int equalCount = 1;

        for (int i = 0; i < wordLength - 1; i++){
            char currentChar = word.charAt(i);
            char nextChar = word.charAt(i + 1);

            if (currentChar == nextChar){
                equalCount++;
            } else {
                if (equalCount == 1){
                    answer.append(currentChar);
                } else {
                    answer.append(currentChar + "" + equalCount);
                }
                equalCount = 1;
            }
        }

        // Ex) KKHSSSSSSSE => 맨 뒤에서 2번째 값 != 맨 뒤 값
        // S != E
        char rear = word.charAt(wordLength - 1);
        char secondOfRear = word.charAt(wordLength - 2);
        if (secondOfRear != rear){
            answer.append(rear);
        } else {
            answer.append(secondOfRear + "" + equalCount);
        }

        return answer.toString();
    }

    public static void main(String[] args) throws IOException {
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String word = br.readLine();
        bw.write(T.solution(word));

        bw.flush();
        bw.close();
    }
}

 

 

두 번째 방법

두 번째 방법에서는 첫 번째 방법의 if/else문 보다 분기문을 조금 더 줄였다.

현재문자(currentChar)와 다음문자(nextChar)이 같지 않을 때, 현재 문자는 answer.append()해주고, 연속되는 횟수(equalCount)가 1보다 크면 압축한 숫자도 append()를 해줬다.

 

위에서 따로 끝에 문자와 끝에서 두 번째 문자를 처리해주는 방법을 입력값(KKHSSSE)  word에 " " 빈 공백을 하나 더 추가해줘서 끝까지 비교해주는 방법을 해결했다.

package section01.E11_문자열_압축;

import java.io.*;

public class MainA {

    public String solution(String word){

        StringBuilder answer = new StringBuilder();
        word = word + " "; // ABCD이면 D까지 반복하기 위해서 끝에 "" 추가...ㅋㅋㅋ 꼼수
        int equalCount = 1;
        int wordLength = word.length();

        for (int i = 0; i < wordLength - 1; i++){
            char currentChar = word.charAt(i);
            char nextChar = word.charAt(i + 1);
            if (currentChar == nextChar){
                equalCount++;
            } else {
                answer.append(currentChar);
                if (equalCount > 1){
                    answer.append(equalCount);
                }
                equalCount = 1;
            }
        }

        return answer.toString();
    }
}
반응형