본문 바로가기
Java/Coding-Test

[Java] 1-11 문자열 압축

by JS1111 2022. 1. 16.

문제

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

입력

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

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

예시 입력

KSTTTSEEKFKKKDJJGG

예시 출력

KST3SE2KFK3DJ2G2

출처

인프런 - 자바-알고리즘-문제풀이-코테대비

내 풀이

private static String compressStr1(String input) {
    StringBuilder sb = new StringBuilder();
    char[] chars = input.toCharArray();

    // 첫 문자로 초기화
    char preChar = chars[0];
    int count = 1;

    // 인덱스1부터(두번쨰 문자) 시작
    for (int i = 1; i < chars.length; i++) {
        if (preChar != chars[i]) { // 다른 문자가 나오면
            sb.append(preChar);    // 결과에 기존문자 추가
            if (count != 1) sb.append(count); // 반복횟수가 1인 경우 생략
            preChar = chars[i];    // 새 문자로 초기화
            count = 1;             // 1로 초기화
        } else {
            count++;
        }
    }
    // 마지막 남은 압축 추가
    sb.append(preChar);
    if (count != 1) sb.append(count);

    return sb.toString();
}

이전문자와 비교하면서 반복횟수를 저장하면서 진행


private static String archive(String str) {
    StringBuilder sb = new StringBuilder();
    str += " "; // 마지막 문자 비교를 위해

    int count = 1;
    char prev = ' ';
    for(int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        if (prev == ch) {
            count++;
        } else {
            if (count != 1) sb.append(count);
            sb.append(ch);
            prev = ch;
            count = 1;
        }
    }

    return sb.toString();
}

다른 풀이

public String solution(String s) {
    String answer = "";
    s = s + " "; // 마지막 문자 비교를 위해
    int cnt = 1;
    for (int i = 0; i < s.length() - 1; i++) {
        if (s.charAt(i) == s.charAt(i + 1)) cnt++; // 다음문자와 비교
        else {
            answer += s.charAt(i);
            if (cnt > 1) answer += String.valueOf(cnt);
            cnt = 1;
        }
    }
    return answer;
}

다음문자와 비교, 문자열 마지막에 공백문자를 추가하여 불필요한 확인코드를 줄였다

기억할 점

문자열 문제풀 때

각 문자끼리 앞뒤로 비교할 경우, 맨 앞 문자와 마지막 문자를 주의

'Java > Coding-Test' 카테고리의 다른 글

[Java] 2-4 피보나치 수열  (0) 2022.01.17
[Java] 1-12 암호  (0) 2022.01.16
[Java] 1-10 가장 짧은 문자거리  (0) 2022.01.16
[Java] 1-9 숫자만 추출  (0) 2022.01.15
[Java] 1-8 유효한 팰린드롬  (0) 2022.01.15

댓글