본문 바로가기

코딩테스트/자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

섹션 1. 문자열 - 11. 문자열 압축

📌 문제 설명

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

  • 반복 횟수가 1인 경우 생략합니다.
  • 문자열의 길이는 최대 100입니다.

📝 입력 & 출력

🔹 입력

  • 첫 번째 줄: 대문자로 구성된 문자열 (최대 길이 100)

🔹 출력

  • 첫 번째 줄: 압축된 문자열 출력

🔸 예제 입력 1

KKHSSSSSSSE

🔸 예제 출력 1

K2HS7E

🔸 예제 입력 2

KSTTTSEEKFKKKDJJGG

🔸 예제 출력 2

KST3SE2KFK3DJ2G2

💡 해결 방법

  1. 문자열을 순회하면서 연속된 문자의 개수를 세기
    • 현재 문자와 다음 문자가 같다면 cnt 증가
    • 현재 문자와 다음 문자가 다르면 결과 문자열에 추가 후 cnt 초기화
  2. 마지막 문자 처리를 위해 문자열 끝에 공백 추가 (s = s + " ")
  3. 반복 횟수가 1 이상일 때만 숫자 추가

💻 코드 구현 (Java)

package partString;

import java.util.*;

public class Problem11 {

    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 += cnt; // 반복 횟수가 1보다 크면 추가
                cnt = 1;
            }
        }
        
        return answer;
    }
    
    public static void main(String[] args) {
        Problem11 T = new Problem11();
        Scanner kb = new Scanner(System.in);
        String s = kb.next();
        System.out.println(T.solution(s));
        kb.close();
    }
}

📖 코드 설명

1️⃣ 문자열 끝에 공백 추가 (s = s + " ")

s = s + " ";
  • 모든 인덱스에서 s.charAt(i+1)과 비교할 수 있도록 보장
    • 기존 문자열의 마지막 문자도 s.charAt(i+1)과 비교해야 하는데, 마지막 문자는 원래 i+1이 존재하지 않음.
  • 인덱스 범위 초과 예외(IndexOutOfBounds)를 방지

2️⃣ 문자 반복 횟수 계산 및 압축 문자열 생성

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 += cnt;
        cnt = 1;
    }
}
  • 현재 문자와 다음 문자를 비교하면서 연속된 문자의 개수를 센다
  • 문자가 바뀌는 순간 압축 문자열에 추가
  • 반복 횟수가 1 이상일 때만 숫자를 추가

⏳ 시간 복잡도 분석

  • O(n) (n: 문자열 길이)
  • 문자열을 한 번 순회하며 연속된 문자의 개수를 세고, 압축 문자열을 생성하므로 선형 시간 복잡도

출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

 

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런

김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급

www.inflearn.com