1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.
제한사항
하... 요즘엔 너무 정체된 느낌이다. 아예 모르던 상황보단 나아졌지만 문제 푸는 실력이 정체된 느낌... 풀면서도 현타오고 개어려웠음. 이게 머누~,,, 흑흑 아무튼 일단 풀었다!
function solution(i, j, k) {
let str = k.toString();
return Array.from({ length: j - i + 1 }, (_, idx) => i + idx)
.map((v) => v.toString())
.filter(v => v.includes(str))
.reduce((a, c) => {
c = c.split('');
for(let char of c) {
if (char === str) a++
}
return a;
}, 0)
}
Array.from({ length: j - i + 1 }, (_, idx) => i + idx)
.map((v) => v.toString())
→ 숫자를 문자열로 변환한다. .filter(v => v.includes(str))
→ 문자열에서 str를 포함한 요소만 남긴다. .reduce((a, c) => {
c = c.split('');
for(let char of c) {
if (char === str) a++
}
return a;
}, 0)
→ 초기값 0
→ 각 문자열 c를 문자 배열로 분해한다.
→ 배열한 문자 배열 char가 str와 같으면 a를 증가시킨다.
→ 최종적으로 str의 등장 횟수를 반환한다.
중간에 filter 부분과 c.split('') 부분은 필요 없어서 최종 제출에서는 제외했다.
너무 길고 복잡하게 풀었다는 생각이 들어서... 줄여보았다 ㅠ 흑흑. 친구
의 도움...
function solution(i, j, k) {
const str = k.toString();
let count = 0;
for (let num = i; num <= j; num++) {
const numStr = num.toString();
for (const char of numStr) {
if (char === str) {
count++;
}
}
}
return count;
}
for (const char of numStr)
이중 포문을 돈다. 변환된 문자열의 각 문자를 이렇게 순회할 수 있다. 굳이... 배열을 새로 만들어주지 않아도 되는구나?! 왠지 더 복잡하게 풀었단 느낌이 들었는데 이유가 있었음 ㅠ 굳이 왜... 만들었니 ㅠ
function solution(i, j, k) {
let a ='';
for(i;i<=j;i++){
a += i;
}
return a.split(k).length-1;
}
function solution(i, j, k) {
let str = Array(j - i + 1).fill(i).map((v, i) => v + i).join('')
return Array.from(str).filter(t => +t === k).length;
}
Array(j - i + 1)
→ i에서 j까지의 숫자를 담을 배열을 생성한다. .fill(i)
→ 생성한 배열을 모두 i로 채운다..map((v, i) => v + i)
→ 배열의 각 요소에 인덱스를 더한다. .join('')
→ 배열의 모든 요소를 하나의 문자열로 결합한다. Array.from(str)
→ 문자열 str를 문자 배열로 반환한다.filter(t => +t === k)
→ 배열에서 각 문자를 숫자로 변환한 후, k와 같은 값만 필터링한다. .length
→ 필터링 된 배열의 길이를 반환한다.