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

김재우·2023년 5월 10일
0

프로그래머스

목록 보기
1/1
post-thumbnail

문제

  • 문제 설명
    숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.


제한사항

  • 3 ≤ number의 길이 ≤ 13
  • -1,000 ≤ number의 각 원소 ≤ 1,000
  • 서로 다른 학생의 정수 번호가 같을 수 있습니다.

  • 입출력 예시
t p result
"3141592""271"2
"500220839878""7"8
"10203""15"3

나의 풀이방법

function solution(t, p) {
var answer = 0;
  let arr = [];
 
  let length = t.length-p.length;
  for (let i = 0; i <= length; i++) {
    let val = t.substr(i, p.length);
    arr.push(val);
  }
  arr.map((v, i) => (Number(v) <= Number(p) ? answer++ : 0));
  return answer;
}

내가 푼 풀이방법은 일단 t.length를 p.length 만큼 빼줘서 첫번째 입출력을 예시로 들면 t의 length 가 7이고 p의 length가 3이다 새로운 length 는 4일것이다. for문은 4보다 커지면 for loop 이 끝날것이다.i는 0부터 시작한다 여기서 str.substr 이라는 method를 사용하면 해당(i,v) i부터 v까지의 문자열을 가져온다. 그래서 0부터 p의 length 만큼을 가져오는 val를 만들었다. 그렇게 되면 i는 for문이 돌때마다 1씩 증가하므로 314,141,415,159,592 가 val가 되고 그걸 새로운 arr 에 푸쉬를 한다음에 map 을 돌려서 문자열인 arr 를 Number로 치환해준다음 작거나 같으면 answer 을 하나씩 증가하게끔 해서 풀었다.

다른사람의 풀이 slice 이용

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;
}

다른사람의 코드 풀이

나랑 접근 방식은 같은 풀이지만 훨씬 가독성이 좋아보인다. method 사용하는것도 별로 없고,
for문에서 cnt 까지 처리를 한게 인상 깊었다.
해당 풀이는 for문을 돌려서 t.length와 p의 length 를 뺀다음 똑같이 1씩 증가시키고 ,
val에다가 t.slice(i,i+p.length) i부터 i+p.length 만큼 잘라오기를 하면 1씩 증가하게 되면서 종료시점의 인덱스도 1씩 증가하기 때문에 3개씩 가져올 수 있다.
그리고 if문을 통해서 문자열에 +를 하면 암시적 형 변환으로 javascript 에선 문자에 +를 하게되면 알아서 넘버로 해석을 하게 되서 문자열에 +를 해준거같다. P 가 value보다 크거나 같으면 cnt 를 증가시킴으로 코드가 종료되는 함수이다.


profile
프론트엔드 꾸준개발자입니다.

0개의 댓글