문제 개요
정수 n(n ≥ 0)과 한 자리 숫자 d(0 ≤ d ≤ 9)를 입력받는 JavaScript 함수를 작성해야 합니다.
함수는 0부터 n 사이의 모든 수 k(0 ≤ k ≤ n)를 각각 제곱한 후, 만들어진 모든 k² 값을 십진법으로 표기할 때 숫자 d가 총 몇 번 등장하는지 세어 그 개수를 반환해야 합니다.
예제 코드
다음은 위 문제를 해결하는 코드입니다.
const n = 25;
const d = 1;
const countDigits = (n, d) => {
let k = 0, count = 0;
d = d.toString();
while (k <= n) {
let a = 0;
let s = (k*k).toString();
for(let i = 0; i < s.length; i++)
if(s[i] == d)
a++;
if (a > 0) {
count += a;
};
k++;
};
return count;
};
console.log(countDigits(n, d));
출력 결과
11
코드 동작 원리
이 코드의 로직을 단계별로 살펴보면 다음과 같습니다.
1. 초기화: 반복 변수 k를 0으로, 결과를 담을 count를 0으로 설정합니다. 비교를 위해 자릿수 d도 toString()으로 문자열로 변환합니다.
2. 제곱 및 문자열 변환: while 루프를 통해 k를 0부터 n까지 하나씩 증가시키며, 각 k를 제곱한 값(k²)을 다시 toString()으로 문자열로 바꿉니다.
3. 자릿수 검사: 변환된 문자열의 각 문자를 순회하면서 목표 자릿수 d와 일치하는지 확인하고, 일치할 때마다 임시 카운터 a를 증가시킵니다.
4. 누적: 해당 제곱수에서 발견된 d의 개수(a)를 전체 count에 더한 뒤, 모든 반복이 끝나면 최종 count를 반환합니다.
n = 25, d = 1인 경우를 예로 들면, 1² = 1, 4² = 16, 10² = 100, 11² = 121, 12² = 144, 13² = 169, 14² = 196, 19² = 361, 21² = 441 등의 제곱값에 숫자 1이 포함되며, 이들을 모두 합산하면 총 11번 등장하게 됩니다.