ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #AIL_24.01.03 // Programmers_크기가 작은 부분 문자열
    AIL( Algorithm I Learned) 2024. 1. 3. 16:11

    ## AIL_ 크기가 작은 부분 문자열

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

    ## solution.JavaScript

    1. 문제의 접근 방식

    주어진 문제는 문자열 t와 p의 길이를 확인한 후, t에서 p와 동일한 길이의 부분 문자열을 추출하여 비교합니다. 이를 위해 반복문을 사용하며, 시작 인덱스는 t의 길이에서 p의 길이를 뺀 범위까지 반복합니다.

     

    각 반복에서 추출한 부분 문자열을 정수로 변환한 후, 이 값을 p가 나타내는 수와 비교합니다. 만약 부분 문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같으면, 카운트를 증가시킵니다.

     

    최종적으로 증가된 카운트를 반환하여 주어진 조건에 맞는 부분 문자열의 개수를 구합니다.


    2. 문제풀이

    function solution(t, p) {
        var answer = 0;
    
        // t의 길이와 p의 길이 계산
        var tLen = t.length;
        var pLen = p.length;
    
        // t에서 p와 같은 길이의 부분 문자열을 추출하여 비교
        for (var i = 0; i <= tLen - pLen; i++) {
            var substring = t.substr(i, pLen);
            var substringNum = parseInt(substring);
            var pNum = parseInt(p);
    
            // 부분 문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 경우 카운트 증가
            if (substringNum <= pNum) {
                answer++;
            }
        }
    
        return answer;
    }
    /*
    테스트 1
    입력값 〉	"3141592", "271"
    기댓값 〉	2
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	"500220839878", "7"
    기댓값 〉	8
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 3
    입력값 〉	"10203", "15"
    기댓값 〉	3
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

     

    1) tp의 길이를 저장하여 변수 tLenpLen에 할당합니다.

     

    2) for 반복문을 사용하여 i를 0부터 시작하여 tLen - pLen까지 반복합니다. 이 범위는 부분 문자열을 추출하기 위한 적절한 범위입니다.

     

    3) 각 반복에서, t에서 현재 인덱스 i부터 pLen 길이만큼의 부분 문자열을 추출하여 substring에 저장합니다.

     

    4) substring을 정수로 변환하여 substringNum에 저장하고, p도 정수로 변환하여 pNum에 저장합니다.

     

    5) substringNumpNum보다 작거나 같으면, 부분 문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 경우이므로 answer를 증가시킵니다.

     

    6) 반복문이 종료되면 최종적으로 카운트된 answer를 반환합니다.


    3. 다른사람의 문제풀이 및 접근방식 분석

    const solution=(t,p)=>Array.from(Array(t.length-p.length+1),(_,i)=>Number(t.slice(i,i+p.length))).filter(v=>v<=Number(p)).length
    /*
    테스트 1
    입력값 〉	"3141592", "271"
    기댓값 〉	2
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	"500220839878", "7"
    기댓값 〉	8
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 3
    입력값 〉	"10203", "15"
    기댓값 〉	3
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1) Array.from: 주어진 길이(t.length - p.length + 1)의 배열을 생성합니다. 이 배열은 t에서 추출할 수 있는 부분 문자열의 개수와 동일합니다.

     

    2)  (_, i) => Number(t.slice(i, i + p.length)): 생성된 배열의 각 요소에 대해 함수를 실행합니다. 여기서 _는 현재 요소의 값에 관심이 없음을 나타내고, i는 현재 인덱스를 나타냅니다. t.slice(i, i + p.length)t에서 현재 인덱스부터 p의 길이만큼의 부분 문자열을 추출합니다. Number 함수를 사용하여 문자열을 정수로 변환합니다.

    결과적으로 입력 문자열의 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 변환되어 반환됩니다.

     

    3)  .filter((v) => v <= Number(p)): 생성된 배열 중에서 p가 나타내는 수보다 작거나 같은 값을 가지는 요소들로 필터링합니다.

     

    4) .length: 필터링된 배열의 길이를 반환합니다. 이는 p보다 작거나 같은 부분 문자열의 개수를 나타냅니다.

     

    이 코드는 함수형 프로그래밍의 원리를 사용하여 한 줄로 간결하게 문제를 해결합니다. 배열과 함수를 적절히 조합하여 부분 문자열을 추출하고, 조건에 맞는 부분 문자열의 개수를 세는 방식입니다.

Designed by Tistory.