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

한재창·2023년 4월 4일
0

크기가 작은 부분 문자열

문제 설명

숫자로 이루어진 문자열 tp가 주어질 때, 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
  • tp는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

입출력 예

tpresult
"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에 해당한다는 점에 주의하세요

나의 풀이

  1. slice() 메서드를 사용하기 위해 t.split('') 를 사용해 t 를 배열로 만들어 준다.
  2. for 문을 arr.length 만큼 돌리고 arr.slice(i, i+p.length) 의 길이와 p의 길이가 같은 것만 arr.slice(i, i+p.length).join('') (p만큼 자르고 ['12','23','34'] 인 것들을 문자열로 만든 뒤) answer.push 한다.
  3. filter() 메서드를 사용해서 p 보다 작거나 같은 숫자들만 배열로 남긴 것의 길이를 return 한다.
function solution(t, p) {
    const arr = t.split('')
    const answer = []
    for(let i=0; i<arr.length; i++) {
        if(arr.slice(i, p.length+i).length === p.length) {
            answer.push(arr.slice(i, p.length+i).join(''))   
        }
      
       // i<arr.length 라면 문자열이 다 끝나고도 slice() 메서드가 실행되는데 p.length 보다 작은 값들로 잘리게 된다.
       // 따라서 p.length 보다 작다면 바로 for 문을 break; 시켜서 코드의 속도를 올려야 한다.
       // 이 부분은 내가 한 코드가 아닌 다른 사람이 한 코드를 가져온 것이다.
       // if(arr.slice(i, p.length+i).length < p.length){
       //     break;
       // }
    }
    return answer.filter((num) => p >= num).length
}

좋다고 생각한 풀이

  1. for 문을 돌리는데 i를 t.length-p.length 만큼만 돌린다. (이렇게 하면 문제 설명처럼 p의 길이만큼 t의 문자열을 딱 맞게 slice() 할 수 있다.)
  2. value 변수에 t.slice(i, i+p.length) 하여 저장한다.
  3. pvalue 를 숫자로 바꾸어서 pvalue 보다 크거나 같으면 count 를 1씩 증가시킨다.
  4. count 를 return 한다.
function solution(t, p) {
    let count = 0;
    for(let i=0; i<=t.length-p.length; i++) {
        let value = t.slice(i, i+p.length);
        if(+p >= +value) count++;
    }
    return count;
}

느낀점

  • slice() 메서드는 배열에서만 사용가능한 줄 알았는데 문자열에서도 사용가능하다.
  • for 문에서 break; 을 깜빡하고 있었다.
  • filter() 메서드를 사용하지 않고 조건에 맞을 때 마다 count 를 증가시키면 되는 거였는데 생각을 좀 더 해서 풀었으면 좋았을 것 같다.
profile
취준 개발자

0개의 댓글