문제 설명
어떤 수가 10a + b 형태로 표현될 때, a − 2b가 7로 나누어떨어지면 원래의 수 역시 7의 배수라는 수학적 성질이 있습니다.
이 규칙을 7의 배수 여부를 명확히 알 수 있는 수가 나올 때까지 반복해서 적용합니다. 두 자리 이하의 숫자는 7의 배수인지 쉽게 판단할 수 있으므로, 수가 두 자리 이하가 되는 시점에 계산을 멈추면 됩니다.
따라서 우리가 작성해야 할 것은 하나의 숫자를 입력받아 위 과정을 반복하고, 두 자리 이하의 수로 줄이는 데 필요한 단계 수(반복 횟수)와 마지막에 얻어진 두 자리 이하의 숫자를 함께 반환하는 JavaScript 함수입니다.
입력
const num = 1603;
출력
const output = [7, 2];
그 이유는 다음과 같은 단계를 거치기 때문입니다.
160 − 2 × 3 = 154
15 − 2 × 4 = 7
최종 값은 7이며, 7은 7의 배수이므로 1603 역시 7의 배수임을 알 수 있습니다.
예제 코드
다음은 위 로직을 구현한 JavaScript 코드입니다.
const num = 1603;
const findSteps = (num) => {
let times = 0;
let result = 0;
let number = String(num);
while (number.length > 2) {
times++;
const lastDigit = Number(number.slice(-1));
const remaining = Number(number.slice(0, number.length - 1));
result = remaining - 2 * lastDigit;
number = String(result);
}
return [result, times];
};
console.log(findSteps(num)); // [7, 2]
코드 동작 원리
알고리즘의 핵심 흐름은 다음과 같습니다.
1. 숫자를 문자열로 변환하여 자릿수를 손쉽게 다룰 수 있게 합니다.
2. slice(-1)로 마지막 자릿수(b)를, slice(0, length - 1)로 나머지 앞부분(a)을 분리합니다.
3. a − 2b를 계산한 뒤 다시 문자열로 저장하여 다음 반복의 대상으로 삼습니다.
4. 숫자의 길이가 2 이하가 될 때까지 이 과정을 반복합니다.
5. 반복이 끝나면 [최종 숫자, 반복 횟수] 형태의 배열을 반환합니다.
출력 결과
[7, 2]
이처럼 간단한 문자열 조작과 반복문만으로 7의 배수 판별 규칙을 효율적으로 구현할 수 있습니다.