본문 바로가기
Algorithm/프로그래머스 코딩테스트 문제풀이전략

[프로그래머스] Lv.2 문자열 압축

by 미네구스 2024. 4. 17.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제풀이 접근

1. 1부터 s/2 길이까지 잘라보면서 결과의 최소값을 비교한다.

2. base 문자열과 cur 문자열을 설정해서 값이 같은지 비교한다.

  2-1. base문자열은 맨 처음 잘라야 하는 부분

  2-2 cur 문자열은 현재 가르키고 있는 부분

3. 만약에 문자열을 비교했을 때, 일치한다면 count를 1 증가시켜준다.

4. 문자열이 같지 않을 때, count가 1보다 크다면 숫자를 sb에 더해준다.

  4-1. 문자열을 sb에 더해준다.

5. base 문자열을 cur로 재정의 해줘 순차적으로 비교할 수 있게 하고, count를 1로 재설정한다.

6. 문자열 길이를 최솟값으로 계속 갱신해준다.

 

class Solution {
    public int solution(String s) {
        int answer = Integer.MAX_VALUE;
        
        if (s.length() == 1) {
            return 1;
        }
        
        for(int i = 1; i <= s.length() / 2; i++){
            StringBuilder sb = new StringBuilder();
            int count = 1;
            String base = s.substring(0,i);
            for (int j = i; j <= s.length(); j += i) {
                
                String cur;
                if (j+i > s.length()) {
                    cur = s.substring(j);
                } 
                else {
                    cur = s.substring(j,j+i);
                }
               
                if (base.equals(cur)) {
                    count++;
                } 
                
                else {
                    if (count > 1) {
                        sb.append(count);
                    }
                    sb.append(base);
                    base = cur; // base값 재정의
                    count = 1;
                }
            }
            
            sb.append(base);
            answer = Integer.min(answer, sb.length());
        }
        
        return answer;
    }
}

 

문제풀이 회고

 

인덱스가 이동하는 부분이 너무 헷갈렸다.

 

특히, 이부분이 나중에도 계속 헷갈렸다.

if (j+i > s.length()) {
    cur = s.substring(j);
}

j+i가 현재 문자열 길이보다 긴 경우, j부터 끝까지 잘라서 더해준다.

 

그 외의 경우엔, s.substr(j,i)만큼 잘라준다.

 

String base = s.substring(0,i);
cur = s.substring(j,j+i);

이 부분을 더 살펴보면,

길이를 1로 자를 때는, base = s.substring(0,1) ; cur = s.substring(1,2);

길이를 2로 자를 때는, base = s.substring(0,2) ; cur = s.substring(2,4);

 

이런식으로 길이만큼 비교하게 된다.!

 

아직 헷갈리는 부분들이 많아서 한번 더 풀어봐야겠다.