[Programmers #147355] - 크기가 작은 부분 문자열

G_NooN·2024년 2월 1일
0

Algorithms

목록 보기
30/33
post-thumbnail

(Lv. 1) 크기가 작은 부분 문자열 (문제 링크)

문제 설명

숫자로 이루어진 문자열 t, p가 주어졌을 때,
t에서 p와 길이가 같은 부분 문자열 중, 해당 문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 부분 문자열의 개수를 return하는 solution 함수를 완성하라.

예를 들어, t = "3141592", p = "271"인 경우, t에서 길이가 3인 문자열은 "314", "141", "415", "159", "592"이며,
이 중 271보다 작거나 같은 수는 141, 159 뿐이므로 2(개)를 return한다.

제한 조건

  1. 1<= p의 길이 <= 18
  2. p의 길이 <= t의 길이 <= 10,000
  3. t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않는다.

입출력 예시


접근 방식

  1. 입력값 : 문자열 t, p / 출력값 : p와 길이가 같지만 p의 숫자보다 작거나 같은 값을 가지는 t의 부분 문자열의 개수
  2. 반복문을 사용하여 t에서 p의 길이와 같은 부분 문자열을 생성한다.
  3. 해당 부분 문자열의 값이 p보다 값이 작거나 같은지 판단한다.
  4. 조건에 일치할 때마다 answer의 값을 1씩 올린다.
  5. 결과를 반환한다.

해결 방법

  1. p와 길이가 같은 부분 문자열을 찾을 것이기 때문에 반복문의 조건식은 t.length - p.length 까지 진행하도록 설정한다.
  2. substring()을 사용하여 p와 길이가 같은 부분 문자열을 생성한다.
  3. parseInt() or Number()를 사용하여 각 부분 문자열의 값을 비교한다.

코드

function solution(t, p) {
  let answer = 0;

  for (let i = 0; i <= t.length - p.length; i++) {
    let subArray = t.substring(i, i + p.length);

    if (Number(subArray) <= Number(p)) answer++;
  }

  return answer;
}

시행착오

초기 접근 방식

  1. t에서 p의 길이와 같은 부분 문자열 배열을 생성한다.
  2. 해당 배열에서 요소의 값이 p보다 작거나 같은 요소의 개수를 찾는다.

t에서 p의 길이와 같은 부분 문자열 배열 생성하기

문제를 해결할 때 가장 어려웠던 부분이었다.

단순하게 부분 문자열이라는 단어를 보고 배열을 생성하려 시도했다.
하지만, 배열을 어떻게 생성해야 하는지가 문제였다.

정규 표현식 또는 p.length를 이용하여 길이를 특정하는 것은 알겠으나, 부분 문자열 배열을 생성하는 방법을 찾지 못했고, 탐색 결과, 반복문을 사용해야 한다는 것을 깨달았다.

굳이 배열을 만들 필요가 있는가

반복문을 사용하는 방법을 찾다보니, 배열을 만들 필요 없이 p의 길이만큼 블럭을 생성하여 t를 한번만 순회하면 되는 문제였다.

for (let i = 0; i <= t.length - p.length; i++) {
  let subArray = t.substring(i, i + p.length);
}

이렇게 구현하면 추가로 filter()를 사용할 필요 없이, for문 내부에서 subArray의 값과 p의 값을 비교하여 subArray의 값이 p보다 작을 때마다 answer++; 를 해주면 되는 부분이었다.


주요 개념

  • 반복문의 활용 개념
  • substring(), slice()
profile
쥐눈(Jin Hoon)

0개의 댓글