양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
x는 1 이상, 10000 이하인 정수입니다.
이 문제를 처음 보고 어? 이번건 쉽네 라고 생각하고 아래와 같이 코딩했다.
function Harshad (x){
let quot = Math.floor(x/10);
let mod = x % 10;
let digitSum = a + b;
result = x % digitSum === 0 ? true : false;
return result;
}
얼핏보면 잘 작동하는 듯 하지만 간과한 사실이 있다
x는 1 이상, 10000 이하인 정수입니다.
....다시하자
공책에 몇 가지 숫자들을 직접 나눠보면서 정수 x 을 10000부터 1000,100,10으로 나눈 각각의 몫과 10으로 나눈 나머지를 더하면 각 자릿수의 합을 구할 수 있는 것을 알았다.
그에 따른 코딩을 아래와 같이 했다.
function Harshad (x){
const quot01 = Math.floor(x/10000);
const mod01 = x % 10000;
const quot02 = Math.floor(mod01/1000);
const mod02 = mod01 % 1000;
const quot03 = Math.floor(mod02/100);
const mod03 = mod02 % 100;
const quot04 = Math.floor(mod03/10);
const lastMod = mod03 % 10;
const digitSum = quot01 + quot02 + quot03 + quot04 + lastMod;
let result = x % digitSum === 0 ? true : false;
return result;
}
성공했다!! 비록 변수만 많고 지저분한 코드지만 어쨌든 스스로 해결했다는 것이 참 좋다.
제출하고 다른 사람의 해답을 봤다.
function Harshad(n){
return !(n % (n + "").split("").reduce((a, b) => +b + +a ));
}
?????이게 무슨 한줄로 가능하다니 천재인가
저 한줄짜리 코드를 열심히 뜯어 보았다.
일단 정수 n을 (n + "")을 통해 문자열로 만들고 그것을 .split("")으로 쪼개었다.
ex) n이 136이면 ["1", "3", "6"]
그리고 1번을 통해 나온 각 요소들에 .reduce를 이용해서 콜백 함수를 수행한다.
그런데 +b + +a 이것은 도대체 무엇일까? 구글링을 해보니 문자열 > 숫자로 변환할 때
해당 문자열 앞에 +를 붙이면 된다고 한다(처음봄)
위 과정을 통해 나온 정수로 n을 나눈 나머지를 구한다.
나머지가 있을 경우 하샤드 수가 아니면서 true가 출력되고
나머지가 없을 경우 하샤드 수이면서 false가 출력되니, 괄호로 묶고 !을 통해 값을 바꿔준다
역시 머리가 나쁘면 몸이 고생이다 이건 플러스로 머리도 더 고생이다