Published 2024. 10. 29. 23:24

TIL

728x90

오늘은 화요일 향해99에서 2번째 맞이하는 날입니다. 

월요일은 회사일이 너무 바뻐서 참여를 못했지만 처음으로 화요일날 참여하게되었습니다. 

TIL - Todya I Learn

 

오늘은 비기너 두번째날 문제를 풀어봤습니다. 

 

문제 설명

숫자로 이루어진 문자열 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에 해당한다는 점에 주의하세요

 

글쓴이의 풀이

 

class Solution {
    public int solution(String t, String p) {
        int pLength = p.length();
        long pValue = Long.parseLong(p);
        System.out.println(pValue);
        int answer = 0;
        for(int i=0; i<=t.length()-pLength; i++){
            String sub = t.substring(i,i+p.length());
            System.out.println(sub);
            long subValue = Long.parseLong(sub);
            if(subValue <= pValue){
                answer ++;
            }

        }
        return answer;
    }
}

 

일단 부분 문자열 추출을 해야됩니다. 

t의 각 가능한 부분의 문자열을 검사해야하기 때문에, t의 길이 만큼 반복하고 부분 문자열 t 에서 시작 인덱스 i 를 기준으로 i 부터 i+p.length() 까지의 문자를 추출하여서 생성합니다. 

그 후에 숫자비교 

문자열로 표현된 숫자를 비교하려면 문자열 => 숫자형으로 변환 해야됩니다. 

[Long.parseLong()] 메서드를 사용합니다.

변환 후 두 숫자(subValue 와 pValue)를 비교해서 위와 같은 조건인지 검사합니다.

 

시간 복잡도는 

- 0(n*m) 입니다. n은 t의 길이이고, m은p 의 길이입니다.

- 각 부분 문자열을 만드는데 0(m)의 시간이 소요되고, 이를 t의 길이 n에 대해 반복하므로 전체적으로 0(n*m) 이 됩니다.

728x90
복사했습니다!