Programmers / 크기가 작은 부분문자열 - 147355

y1nlog·2025년 1월 13일
0

[level 1] 크기가 작은 부분문자열 - 147355

문제 링크

성능 요약

메모리: 37.1 MB, 시간: 3.10 ms

구분

코딩테스트 연습 > 연습문제

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2025년 01월 13일 09:36:24

문제 설명

숫자로 이루어진 문자열 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으로 시작하지 않습니다.

입출력 예
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에 해당한다는 점에 주의하세요

풀이

  • sliceArr : 부분문자열을 담을 빈 배열
  • for Loop : idx = 0부터 순회하며 p의 길이만큼을 배열로 반환(slice), 이 때 end index는 t.length - (p.length-1)

t = 12345 / p = 13 일 때.
for (let i = 0; t.length - (p.length-1); i++)
index = 0 부터 (5 - 1) = 4번 인덱스까지 순회하는 것
=> "12", "23", "34", "45"

  • forEach Loop : 만들어진 sliceArr 배열을 순회하며 각 요소가 p보다 작거나 같은지를 검증. 자바스크립트이니까 자체 형변환을 믿고 다른 처리는 하지 않았다 ㅋ
    answer : 새로 만든 부분 문자열 중에 p와 같거나 작으면 ++
function solution(t, p) {
    var answer = [];

    let sliceArr = [];
    for (let i = 0; i< t.length - (p.length-1);i++){
        sliceArr.push(t.slice(i, i+p.length));
    }
        
    sliceArr.forEach(e => {
        if( e <= p ){
            answer ++;
        } 
    })
    return answer;
    }   

다른 사람의 풀이

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(start,end) 메소드는 start 부터 end 직전의 요소까지 복사해 새로운 배열로 반환한다.
  • 그러니까, sliceArr 라는 추가적인 배열은 만들 필요가 없었다는 것!
  • 바로 t 문자열에 slice처리해 나온 부분 문자열을 새로운 변수에 할당해주고, 배열 순회(forEach) 없이 바로 p랑 비교해준다.
  • 새로운 점 하나 더... 자바스크립트는 string속성의 문자열(그런데 숫자로 구성된) 앞에 + 처리 하나만으로 형변환이 가능하다.
  • 클린코드 작성의 중요성을 깨우치는 오늘의 문제
profile
FrontEnd Developer

0개의 댓글