[js] k의 개수

sookyoung.k·2024년 6월 18일
1
post-thumbnail

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

나의 풀이

하... 요즘엔 너무 정체된 느낌이다. 아예 모르던 상황보단 나아졌지만 문제 푸는 실력이 정체된 느낌... 풀면서도 현타오고 개어려웠음. 이게 머누~,,, 흑흑 아무튼 일단 풀었다!

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)
}
  • 먼저 숫자 k를 문자열로 변환하여 str에 저장한다.
  • Array.from({ length: j - i + 1 }, (_, idx) => i + idx)
    • 첫 번째 인자 → 길이가 j-i+1인 배열 생성
    • 두 번째 인자에 들어간 함수 → 배열의 각 요소를 i부터 j까지의 숫자로 채운다 (ex. [i, i+1, i+2, ..., j])
  • .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;
}
  • i부터 j까지의 숫자를 for문을 통해 돌면서
  • num을 문자열로 변환한 후
  • for (const char of numStr) 이중 포문을 돈다. 변환된 문자열의 각 문자를 이렇게 순회할 수 있다.
  • 이후는 나와 같음

굳이... 배열을 새로 만들어주지 않아도 되는구나?! 왠지 더 복잡하게 풀었단 느낌이 들었는데 이유가 있었음 ㅠ 굳이 왜... 만들었니 ㅠ

다른 풀이 1

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

    return a.split(k).length-1;
}
  • 빈 문자열 a를 초기화한다.
  • i부터 j까지의 숫자를 순회하면서 각 숫자를 문자열로 변환한 후 a에 이어붙인다.
  • split() 메서드를 사용하여 a를 k로 분할한다. 그 배열의 길이에서 1을 빼면 k가 등장한 횟수가 된다.

다른 풀이 2

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 → 필터링 된 배열의 길이를 반환한다.
profile
영차영차 😎

0개의 댓글