[이코테][Java] 문자열 압축

2025. 6. 1. 23:42·PS/이코테

[문제링크]

https://school.programmers.co.kr/learn/courses/30/lessons/60057

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명

문자열에서 같은 값이 연속해서 나타는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현한다.

압축하여 표현한 문자열 중 가장 짦은 것의 길이를 구한다.

 

 

 

 

 

문제 풀이

문자를 압축하는 패턴 길이의 범위를 1 ~ (문자열 길이 / 2) 로 해서 각 패턴별로 문자열을 압축하는 방법을 모두 구한다.

그 중에서 문자열의 길이가 가장 짧은 단위를 찾는다.

 

압축 패턴 길이의 범위는 1 ~ (문자열의 길이 / 2)

  • 압축 패턴의 길이가 (문자열의 길이)/2를 넘으면 같은 문자열이 반복될 수가 없다.
  • ex) 문자열의 길이가 10인 "abcdeabcde"를 길이가 6인 압축 패턴으로 압축해보면, "abcdea", "bcde"로 나누어져 압축할 수 없다.
  • substring() 으로 압축 문자열 패턴을 생성한다.

for문을 돌면서 압축 문자열 패턴과 비교

  • 같으면 반복횟수(cnt) 증가
  • 같지 않으면 {반복횟수 + 압축 문자열 패턴} 추가

 

압축 단위로 나누어 떨어지지 않는 마지막 문자들을 이어 붙인다.

  • 문자열이 압축 단위로 나누어 떨어지지 않을 수도 있기 때문에 마지막에 남은 문자를 추가한다.
class Solution {
    public int solution(String s) {
        int answer = s.length();

        // 1 ~ s.length()/2 범위로 압축
        for (int i = 1; i <= s.length() / 2; i++) {
            String compressed_str = "";    //i개 단위로 압축한 문자열
            String pre_str = s.substring(0, i); //압축시킬 문자열 패턴
            int cnt = 1;  //문자열의 반복횟수

			//압축 패턴으로 문자열 자르기
            for (int j = i; j <= s.length(); j += i) {
                int end = Math.min(s.length(), j + i);  //끝 인덱스가 문자열 길이보다 넘지 않게 한다.
                String cur_str = s.substring(j, end);

                if (cur_str.equals(pre_str)) {  // 같으면 압축가능: 반복횟수 증가
                    cnt++;
                } else {    //같지 않으면 압축불가능: 문자열에 {반복횟수 + 압축 문자열 패턴} 추가
                    compressed_str += (cnt > 1 ? cnt + pre_str : pre_str);  //cnt=1이면 1은 생략
                    cnt = 1;
                }
                pre_str = cur_str;  //이전 문자열 패턴을 현재 문자열 패턴으로 변경
            }

            compressed_str += pre_str;  //압축 단위 i에 나누어 떨어지지 않은 마지막 문자 붙이기
            answer = Math.min(answer, compressed_str.length());	//
        }
        return answer;
    }
}

 

✔️ 처음에 문제를 풀 때, 압축단위 i에 나누어 떨어지지 않는 문자열의 마지막 부분을 생각하지 못했었다.


 

[참고]

이것이 취업을 위한 코딩 테스트다 with 파이썬 by 나동빈

https://bada744.tistory.com/127

저작자표시 비영리 변경금지 (새창열림)

'PS > 이코테' 카테고리의 다른 글

[백준][Java] 14502번 : 연구소  (0) 2025.06.01
[이코테][Java] 퇴사  (0) 2025.05.12
[이코테][Java] 연산자 끼워넣기  (0) 2025.05.12
[이코테][Java] 병사 배치하기  (0) 2025.04.29
[이코테][Java] 편집거리  (0) 2025.04.27
'PS/이코테' 카테고리의 다른 글
  • [백준][Java] 14502번 : 연구소
  • [이코테][Java] 퇴사
  • [이코테][Java] 연산자 끼워넣기
  • [이코테][Java] 병사 배치하기
nyrimmm
nyrimmm
  • nyrimmm
    개발기록
    nyrimmm
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (76)
      • Java (6)
      • Spring & SpringBoot (3)
      • Network (1)
      • DataBase (0)
      • SQL (1)
      • IntelliJ (3)
      • Git (0)
      • 자료구조 & 알고리즘 (2)
      • 트러블 슈팅 (1)
        • Spring (1)
      • PS (58)
        • 백준 (16)
        • 프로그래머스 (0)
        • SQL (9)
        • 이코테 (33)
      • 후기 & 회고 (1)
  • 태그

  • 인기 글

  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
nyrimmm
[이코테][Java] 문자열 압축
상단으로

티스토리툴바