Algorithm/Programmers(Java)

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

비망노트 2023. 1. 13. 22:11

문제 설명

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서,

이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다.

이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

 

제한 사항

- 1 ≤ p의 길이 ≤ 18
- p의 길이 ≤ t의 길이 ≤ 10,000
- t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

 

입출력 예

t p result
"3141592" "271" 2
"500220839878" "7" 8
"10203" "15" 3

 

입출력 예 설명

입출력 예 #1
본문과 같습니다.

입출력 예 #2
p의 길이가 1이므로 t의 부분문자열은 "5", "0", 0", "2", "2", "0", "8", "3", "9", "8", "7", "8"이며

이중 7보다 작거나 같은 숫자는 "5", "0", "0", "2", "2", "0", "3", "7" 이렇게 8개가 있습니다.

입출력 예 #3
p의 길이가 2이므로 t의 부분문자열은 "10", "02", "20", "03"이며,

이중 15보다 작거나 같은 숫자는 "10", "02", "03" 이렇게 3개입니다.

"02"와 "03"은 각각 2, 3에 해당한다는 점에 주의하세요

 

 

 

⭕ 풀이 ( char[] 사용 )

class Solution {
    public int solution(String t, String p) {
        int result = 0;
        char[] arr = t.toCharArray();
        String temp = "";
        
        for(int i=0;i<=arr.length-p.length();i++){
            temp = "";
            int j=i;
            while(temp.length()<p.length()){
                temp += arr[j];
                j++;
            }
            if(Long.parseLong(temp)<=Long.parseLong(p)){
                result++;
            }
        }
        return result;
    }
}

입력되는 t를 toCharArray 메서드를 사용해 char배열로 만든다.

반복문은 예제 1번의경우

3141592.length() = 7이며

271.length() = 3이기때문에

반복문의 i는 7-3 까지만 진행해준다.

 

이후 while문을 활용하여 각자리의 숫자형 문자열을 담는데

temp의 길이가 p의 길이보다 작은동안만 반복한다

길이가 같아지게되면 while문에 끝나므로 p의 길이와 같은 길이의 temp가 완성된다.

 

그렇게 완성된 숫자로 이루어진 문자열 temp와 p를 long타입으로 형변환하여 비교한다

 

 

 

⭕ 풀이 ( substring사용 )

class Solution {
    public int solution(String t, String p) {
        int result = 0;
        int pLength = p.length();
        for(int i=0;i<=t.length()-pLength;i++) {
            if(Long.parseLong(t.substring(i, i+pLength))<=Long.parseLong(p)) {
                result++;
            }
        }
        return result;
    }
}

 

이번에는 char배열 없이 substring으로 바로 잘라서 비교하는 풀이다.

 

위의 풀이와 같은 맥락으로

"3141592".length()  = 7

"271".length() = 3 

i <= 7-3 까지만 반복하는데

char[]을 사용하지 않았으므로 반복문을 한번 더 실행해줄필요 없이

substring메서드를 사용해 i부터 i+plength까지 잘라 비교한다.

 

 

 

 

문자열함수들은 아무래도 지금까지 사용했을때 시간이 다른문제들보다 많이걸려서

두 방식으로 풀어봤는데 toCharArray를 사용했을때와 substring을 사용했을때의 속도차이가 꽤 심했다.

 

 

 

 

-출처

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