본문 바로가기

심심풀이용

[프로그래머스] 크기가 작은 부분 문자열

처음 문제를 봤을때 간단하게 해결될 줄? 알았던 문제이다.

코드실행 했을 때도 무난하게 모두 통과되면 자연스럽게 넘어가는 듯 했다. (사실 난이도도 높지 않았음)

        int answer = 0;
        int length = p.length();
        List<String> list = new ArrayList<>(Arrays.asList(t.split("")));
        
        int count = 1;
        while(count <= t.length() - length + 1){
            StringBuilder sb = new StringBuilder();
            for(String item : list) {
                sb.append(item);
                if (sb.length() == length) break;
            }
            list.remove(0);
            if(Integer.parseInt(sb.toString()) <= Integer.parseInt(p)){
                answer++;
            }
            count++;
        }

        return answer;

 

 

빠르게 다음문제를 풀기 위해 바로 체출하기를 눌렀다.

 

그런데 런타임 에러가 주주죽 뜨는거임.....

 

아.. 내가 또 엄청 느려터진 코드를 작성했나보다.. 라고 생각하고 불필요하게 while 문이나 for문을 돌렸나보다 라고 생각을 했다.

 

 

생각해보니 while 에서 자꾸 StringBuffer를 새로 만들어 주었었네?.. 일단 이부분을 고치기로함 근데 이걸로 해결될것 같지는 않았다..

        int answer = 0;
        int length = p.length();
        StringBuilder sb = new StringBuilder();
        char[] ch = t.toCharArray();
        for(int i=0;i<t.length() - p.length() + 1;i++){
            int idx = i;
            while(sb.length() < length){
                sb.append(ch[idx]);
                idx++;
            }
            if(Integer.parseInt(sb.toString()) <= Integer.parseInt(p.toString())){
                answer++;
            }
            sb.delete(0, length);
        }
        return answer;

 

 

당연히 안됨 ㅋㅋㅋㅋ

 

그래서 코드를 줄여보자 라고 생각해서 이만큼이나 일단 줄여봄... 

 

기존 for문으로 문자 길이만큼 자르던걸 subString을 이용해서 한방에 통으로 잘라서 사용했음.

        int answer = 0;
        int length = p.length();
        for(int i=0;i<t.length() - length+1;i++){
            if(Integer.parseInt(t.substring(i, length+i)) <= Integer.parseInt(p)){
                answer++;
            }
        }
        return answer;

런타임 런타임 런타임.......!!!!!!!!!!!!!!!! 한 2분정도 고민해봄.

 

 

이때 문득 생각난게..  형변환할때는 속도가 느리다고 들었던 기억이 스윽 지나갔었음.

그래서 Integer.parseInt를 빼고 String클래스 함수인 compareTo 함수를 사용해보기로 마음을 먹었음.

 

근데 이게 어떤 식으로 작동하는지 몰라서 대충 출력해봤더니....

str1.compareTo(str2) 이렇게 실행했는데 이런식으로 대충 나왔음..

음... str1 > str2 이면 양수로 나오고 str1 < str2 이면 음수 str1 = str2 이면 0 으로 나오는거 같은 느낌이 들어서

바로 코드로 짜봄..

 

이번엔 좀더 깔끔하게 삼항연산자 까지 사용해서 코드를 확 줄여버림.

무조건 줄인다고 좋은 코드가 아니지만 뭔가 보기 편해서 좋았음.

        int answer = 0;
        int length = p.length();
        for(int i=0;i<t.length() - length+1;i++){
            answer=t.substring(i, length+i).compareTo(p)>0?answer:answer+1;
        }
        return answer;

 

 

하.. 이게 이렇게 힘들게 풀릴 일인가?.. 라는 생각과 함께 parse 할떄 시간이 엄청나게 소요된다는 사실을 깨닫게 되었다.