문제 설명
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
제한 조건
- x는 1 이상, 10000 이하인 정수입니다.
입출력 예
arr | return |
10 | true |
12 | true |
11 | false |
13 | false |
입출력 예 설명
- 입출력 예 #1
10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다. - 입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다. - 입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다. - 입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.
내풀이
function solution(x) {
let answer = true;
const str = x.toString();
let sum = 0;
for(let i = 0; i < str.length; i++){
sum += Number(str[i]);
}
return x % sum == 0;
}
문제 해결 과정
먼저 하샤드 수라는 것에 대한 정의가 필요하다. 위에 문제 설명 그대로 하샤드의 수는 "x라는 양의 정수에 각 자릿수 합을 더한 값으로 x가 나누어 떨어지는 수"이며, 문제의 출력 결과는 입력에 대한 값에 대해 하샤드의 수인지 판별하는 문제로 파악했다.
수가 맞는지에 대한 참 혹은 거짓의 결과를 알려주면 되기 때문에 받은 인자의 x 값을 각 자릿수로 해서 그 값을 모두 더하고, 그 결과를 x와 나누어 떨어지는지에 대한 식을 세우기로 했다.
내 경우에는 숫자의 값을 문자열로 바꾸고, 그것을 문자열의 인덱스마다 sum에 더해준 다음에 return에서 x와 sum이 나누어 떨어지는지 평가해서 answer의 값이 바뀌도록 했다.
다른 방법 ( 숫자 연산을 이용한 방법 )
또 다른 것을 생각했을 때는 우선 x의 원본 값을 다른 변수에 저장해 둔 후 x의 값을 10으로 나누어서 각 자릿 수가 0이 될 때 까지 sum에 더하고, 기존 x의 값은 10을 나누고 소숫점은 버림으로써, 반복문이 유한하게 반복되도록 처리하고, 자릿수가 0이 되어 return 문에 도달하면 저장해둔 원본 값이 담긴 x와 자릿수의 총 합산을 나누어 true인지 false인지 비교했을 것 같다. ( 아무래도 숫자로 접근하는 쪽이 실행 속도는 더 빠르다, 그 이유는 형변환 과정과 배열을 만드는 과정이 추가되기 때문이다. )
function solution(x) {
let num = x;
let sum = 0;
do {
sum += x%10;
x = Math.floor(x/10);
} while (x>0);
return !(num%sum);
}
다른 사람 풀이
먼저 n을 문자열로 만든 후, split을 이용해서 배열을 만든 다음 reduce로 합을 구하는 방식으로 보다 간결하게 구하는 코드를 참조할 수 있었다. 중간에 reduce 인자가 반환 값에서 더하는 연산을 하는 것은 현재 a와 b의 값이 string type으로 이를 number tpye으로 변환하는 연산에 의한 묵시적인 형변환을 수행하는 과정이다. (마찬가지로 앞에 n + '' 의 연산도 string type으로 묵시적인 형변환을 수행한다.)
코드가 간결하지만 무엇을 의미하는 코드인지 한 눈에 파악하기 힘들어서, 짧은 코드가 이해하기 쉽고 좋은 코드는 아니라는 생각이 들었다. 그래도 한 줄로 메서드를 잘 활용해서 구현한다는 부분에서 "이런 방식도 있구나" 하고 참고가 됐다.
function Harshad(n){
return !(n % (n + "").split("").reduce((a, b) => +b + +a ));
}
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[ Lv. 2 ] 소수 찾기 - JavaScript (0) | 2022.06.25 |
---|---|
[ Lv. 1 ] 모의고사 - JavaScript (0) | 2022.06.25 |
[ Lv. 1 ] 최대공약수와 최소공배수 - JavaScript (0) | 2022.06.11 |
[ Lv. 1 ] 핸드폰 번호 가리기 (0) | 2022.06.11 |
[ Lv. 1 ] 직사각형 별 찍기 - JavaScript (0) | 2022.06.10 |