크기가 작은 부분 문자열

hwisaac·2024년 10월 29일
0

코테TIL

목록 보기
2/20

오늘의 학습 키워드

  • 슬라이딩 윈도우
  • 부분 문자열
  • JavaScript에서의 문자열 처리
  • 시간 복잡도와 최적화

문제

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

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

풀이

function solution(t, p) {
    var answer = 0;
    
    let minString
    let maxString
    if (t.length >= p.length){
        minString = p
        maxString = t
    }else{
        minString = t
        maxString = p
    }
    minString, maxString //
    const minLength = minString.length;
    
    for (let i=0 ; i < maxString.length - minLength+1 ; i++){
        const subString = maxString.slice(i, i+minLength)
        subString
        if (Number(subString) <= Number(minString )){
            answer ++;
        }
    }
    return answer;
}

정답은 맞췄지만, 문제를 꼼꼼히 읽지 않아서 불필요한 코드가 추가되었습니다.

개선한 풀이

function solution(t, p) {
    let answer = 0;
    const pLength = p.length;

    for (let i = 0; i <= t.length - pLength; i++) {
        const subStr = t.slice(i, i + pLength);
        if (subStr <= p) {
            answer++;
        }
    }

    return answer;
}

공부한 내용 본인의 언어로 정리하기

오늘은 슬라이딩 윈도우를 활용한 부분 문자열 문제 풀이를 연습했습니다. t 문자열에서 p와 길이가 같은 모든 부분 문자열을 순차적으로 비교하며 조건에 맞는 값을 찾아야 했기 때문에, 조건문과 반복문을 활용한 최적화가 중요했습니다. slice를 사용하여 부분 문자열을 추출하고, JavaScript에서 숫자로 비교하는 것과 문자열 비교의 차이를 확인할 수 있었습니다.


오늘의 회고

  • 어떤 문제가 있었고, 나는 어떤 시도를 했는지
    주어진 문제에서 tp 문자열 길이를 조건으로 여러 부분 문자열을 검사해야 하는데, 불필요한 조건을 줄여 코드를 간결하게 만들고자 했습니다. 처음에는 길이 비교를 통해 변수를 나누었지만, 불필요한 부분이라는 것을 깨닫고 단순화할 수 있었습니다.

  • 어떻게 해결했는지
    문제의 제약을 명확히 이해한 뒤, tp의 길이에 따라 불필요한 조건문을 제거하고, 직접적인 비교만으로 해결했습니다. 문자열을 숫자 변환 없이 비교할 수 있다는 점을 새롭게 알았습니다.

  • 무엇을 새롭게 알았는지
    JavaScript에서 <= 연산자를 통해 문자열 숫자 비교를 바로 할 수 있다는 점이 흥미로웠습니다. 이로 인해 불필요한 숫자 변환 과정을 생략하여 성능을 개선할 수 있었습니다.

  • 내일 학습할 것은 무엇인지
    내일은 슬라이딩 윈도우 기법을 더 복잡한 문제에 적용해보며 시간 복잡도를 최적화하는 방법에 집중할 계획입니다. 다양한 문자열 비교 방식과 배열 탐색 기법도 함께 학습할 예정입니다.

0개의 댓글