본문 바로가기
알고리즘/완전탐색

[JAVA 프로그래머스] lv2/ 문자열 압축

by Meaning_ 2022. 7. 13.
728x90
반응형

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

 

프로그래머스

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

programmers.co.kr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.io.IOException;
 
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++){
            String prev=s.substring(0,i);
            String comp="";
 
            int count=1;
 
 
            for(int j=i;j<=s.length();j+=i){
                if(j+i>s.length()){
                    comp+=s.substring(j);
                    continue;
                }
                if(prev.equals(s.substring(j,j+i))){
                    count++;
                }else{
                    if(count>1){
                        comp+=Integer.toString(count)+prev;
                    }else{
                        comp+=prev;
                    }
                    prev=s.substring(j,j+i);
                    count=1;
                }
 
            }
            
            //남은 애들
            if(count>1){
                comp+=Integer.toString(count)+prev;
            }else{
                comp+=prev;
            }
 
 
            answer=Math.min(answer,comp.length());
 
        }
 
        
        return answer;
    }
}
cs

 

java에서는 문자열을 자를 때 substring함수를 이용한다.

 

다만 이 문제를 풀면서 중요한것은 이중 for문에서 문자열 길이만큼 for문을 돌리지만

if(j+i>s.length()){
                    comp+=s.substring(j);
                    continue;
}
 
만약 j+i가 s.length()보다 커지면 더이상 substring을 할 수 없기에 따로 처리를 해줘야한다. 그래서 j부터 마지막까지만 잘라주면 된다.
 

만약  splice에서 남는게 생겼을 때  예외처리를 더 꼼꼼하게 해본 코드 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.io.IOException;
 
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++){
            String prev=s.substring(0,i);
            String comp="";
            boolean odd=false;
 
            int count=1;
 
 
            for(int j=i;j<=s.length();j+=i){
                if(j+i>s.length()){
 
                    if(j<s.length()){
                        odd=true;
                        if(count>1){
                            comp+=Integer.toString(count)+prev;
                        }else{
                            comp+=prev;//이전것을 담아주기
                        }
                    }
 
 
                    comp+=s.substring(j);
 
 
                    break;
 
                }
                if(prev.equals(s.substring(j,j+i))){
                    count++;
                }else{
                    if(count>1){
                        comp+=Integer.toString(count)+prev;
                    }else{
                        comp+=prev;
                    }
                    prev=s.substring(j,j+i);
                    count=1;
                }
 
            }
            
            //남은 애들
            if(!odd){
                if(count>1){
                    comp+=Integer.toString(count)+prev;
                }else{
                    comp+=prev;//이전것을 담아주기
                }
            }
 
 
            answer=Math.min(answer,comp.length());
 
        }
 
        
        return answer;
    }
}
cs

aabbaccc가 있을 때 이걸 3개씩 자르면

 

aab/bac/cc로 잘리게 되는데 그러면 뒤에 cc가 남게 된다. 

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

이 코드를 만났을 때 j가 6일때 조건문에 걸리게 된다. 근데 이때 comp+=s.substring(j)를 하게 되면

comp가 사실상 aabccbac가 된다. 그니까 저 조건문을 만나면서 가장 끝에 잘려야하는 cc가 중간으로 와버리게 되는 것이다..! 그래서 남는게 생기면 먼저 잘라주고 남는애들을 뒤에 붙여주는걸 한번에 몰아서 써줬다. 

 

88점 맞았던 처음 쓴 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import java.util.*;
 
class Solution {
    public int solution(String s) {
        int len=s.length();
        int splitLen=1;
 
        int minLen=Integer.MAX_VALUE;
        
        if(len==1){
            
            return 1;
        }
 
        
 
 
        while(splitLen<=len/2){
 
            String ss="";
 
 
            ArrayList<String>stringList=new ArrayList<String>();
            ArrayList<Integer>intList=new ArrayList<Integer>();
 
            int i=0;
            int latestIdx=0;
            while(i+splitLen<=len){
                String target="";
                latestIdx=stringList.size()-1;
                target=s.substring(i,i+splitLen);
                if(latestIdx>=0&&stringList.get(latestIdx).equals(target)){
                    int num=stringList.indexOf(target);
                    int cnt=intList.get(num);
                    cnt+=1;
                    intList.set(num,cnt);
 
                }else{
                    stringList.add(target);
                    int num=stringList.indexOf(target);
                    intList.add(1);
                }
                i+=splitLen;
 
            }
            
            //마지막 애들 담아주기
            String target=s.substring(i);
            if(latestIdx>=0&&stringList.get(latestIdx).equals(target)){
                int num=stringList.indexOf(target);
                int cnt=intList.get(num);
                cnt+=1;
                intList.set(num,cnt);
 
            }else{
                stringList.add(target);
                int num=stringList.indexOf(target);
                intList.add(1);
            }
 
 
            for(int j=0;j<stringList.size();j++){
                if(intList.get(j)>1){
                    ss+=Integer.toString(intList.get(j))+stringList.get(j);
 
                }else{
                    ss+=stringList.get(j);
                }
 
 
            }
 
 
            if(ss.length()<minLen){
                minLen=ss.length();
            }
            splitLen+=1;
 
        }
        
        return minLen;
    }
}
cs
728x90
반응형

댓글