Front-End/Algorithm

[프로그래머스 / JavaScript] Lv.1 k의 개수

Olivia Kim 2023. 4. 13. 14:54
반응형

 

문제

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해 주세요.

 

 

제한사항

  • 1 ≤ i < j ≤ 100,000
  • 0 ≤ k ≤ 9

 

 

입출력 예

i j k result
1 13 1 6
10 50 5 5
3 10 2 0

입출력 예 #1
본문과 동일합니다.

입출력 예 #2
10부터 50까지 5는 15, 25, 35, 45, 50 총 5번 등장합니다. 따라서 5를 return 합니다.

입출력 예 #2
3부터 10까지 2는 한 번도 등장하지 않으므로 0을 return 합니다.

 

 


내가 작성한 답안

function solution(i, j, k) {
    // 변수 arr에 i부터 j까지의 수를 순차적으로 담는다.
    let arr = Array.from(Array(j - i + 1), (x, y) => i + y);
    // 배열 안의 모든 수를 하나의 문자열로 만든다.
    const str = arr.join('');
    // str의 전체 길이와 str에서 k를 제외한 길이를 빼 답을 return한다.
    return str.length - str.replaceAll(k, '').length;
}

 

이전에 합성수 찾기 답안에서 배웠던 n부터 m까지의 수를 순차적으로 배열에 담는 법을 적용해 볼 수 있어 좋았다.

 

 

String.prototype.replaceAll(pattern, replacement)

pattern의 모든 일치 항목이 replacement로 대체된 새 문자열을 반환한다. 이때 pattern이 정규표현식이라면 전역(g) 플래그가 설정되어있어야 한다. 그렇지 않으면 TypeError가 발생한다.

 

 


다른 사람들이 작성한 답안

function solution(i, j, k) {
    let a ='';
    for(i;i<=j;i++){
        a += i;
    }

    return a.split(k).length-1;
}

 

 

코드 해석

 

 

i = 3, j = 10, k = 2라고 가정했을 때 3부터 10까지 순차적으로 증가하며 a에 현재의 i값을 더한다. 이때 a는 빈 문자열로 선언해 줬으므로 숫자의 + 값이 아닌 문자열의 + 값으로 계산된다.

 

 

 

이번엔 i, j, k값을 i = 1, j = 13, k = 1이라고 가정해 보자. 위와 동일하게 for문을 돌려 a += i를 한 뒤 a를 k를 기준으로 하여 split한다. 그러면 k값은 ''의 빈 문자열 형태로 바뀐 채 k를 기준으로 문자열이 쪼개져 배열에 담기게 된다. 

 

 

 

1부터 13까지의 12345678910111213 문자열을 1을 기준으로 나눠보면, 1 / 23456789 / 1 / 0 / 1 / 1 / 1 / 2 / 1 / 3이다. 여기서 우리가 찾을 1의 개수는 6개이다. 이를 코드로 구현할 때 a.split(k).length값을 return하면 원래의 값보다 +1이 된 값이 출력되므로 -1을 하여 개수를 출력한다.

 

 


[참고 자료]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll

 

String.prototype.replaceAll() - JavaScript | MDN

replaceAll() 메서드는 pattern의 모든 일치 항목이 replacement로 대체된 새 문자열을 반환합니다. pattern은 문자열 또는 RegExp일 수 있으며 replacement는 각 일치 항목에 대해 호출되는 문자열 또는 함수일

developer.mozilla.org

 

 

 

반응형