문제
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
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll
'Front-End > Algorithm' 카테고리의 다른 글
[프로그래머스 / JavaScript] Lv.1 숫자 문자열과 영단어 (0) | 2023.04.20 |
---|---|
[프로그래머스 / JavaScript] Lv.0 한 번만 등장한 문자 (0) | 2023.04.15 |
[프로그래머스 / JavaScript] Lv.1 신규 아이디 추천 (ft. 테스트 케이스) (0) | 2023.04.12 |
[프로그래머스 / JavaScript] Lv.1 로또의 최고 순위와 최저 순위 (0) | 2023.04.11 |
[프로그래머스 / JavaScript] Lv.1 행렬의 덧셈 (3) | 2023.04.10 |