프로그래머스, Lv2, 문자열 압축

u·2022년 3월 29일
0

Algorithm

목록 보기
5/21

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

푸는데 오래걸린 이유

문제의 본문은 제대로 읽었지만, 예시 부분을 제대로 읽지 않아서 조건을 제대로 활용할 수 없었다.
또한, 노래를 들으면서 풀어서 생각을 제대로 하지 않았다. 다음부터는 노래를 듣지 않으면서 풀어야겠다.

배운점

문자열을 압축하는 아이디어로 각 단위로 문자열을 새로 인덱싱 하는 개념으로 접근했다.
하지만 이렇게 풀면 오래걸리고 조건을 맞추기 까다로웠다.
다른 사람의 풀이를 보는데 이중for문을 사용하는 것이 아닌 재귀를 통해 코드를 엄청나게 단축시켰다.
앞으로 반복문을 쓰기 전에 재귀문을 쓸 수 있는지 함께 고민해봐야겠다

나의 반복문 코드

class Solution {
    public static void main(String[] args) {
       String s = "aabbaccc"; 
       System.out.println(solution(s));
    }
    public static int solution(String s) {
        int answer = s.length();
        
        for(int c = 1; c <= s.length()/2; c++){
            String tmp = "";
            String target = s.substring(0,c);
            int cnt = 0;
            int len = s.length()/c * c;
			for(int i=0; i<len; i+=c){
                if(target.equals(s.substring(i, i+c))){
                    cnt++;
                }else{
                    String _cnt = cnt==1 ? "" : String.valueOf(cnt);
                    tmp = tmp.concat(_cnt+target);
                    cnt = 0;
                    
                    target = s.substring(i, i+c);
                    cnt++;
                }
                
                //마지막 원소
                if(i == len-c){
                    String _cnt = cnt==1 ? "" : String.valueOf(cnt);
                    tmp = tmp.concat(_cnt+target);
                    tmp = tmp.concat(s.substring(i+c, s.length()));
                    // if(i+c < s.length()) tmp = tmp.substring(i+c, s.length());
				}
			}
            // System.out.println(tmp);
            answer = Math.min(answer, tmp.length());
        }
        return answer;
    }
}

재귀를 이용한 풀이

코드를 입력하세요

코드 분석

위의 코드에서 볼 수 있듯이 반복문이 더럽거나, 마지막 끝 처리가 부드럽지 못할 때 재귀를 통한 반복을 이용하면 훨씬 간편하게 코드를 작성할 수 있다.

0개의 댓글