문제 출처 : 프로그래머스 prorammers - 하샤드수 (링크)
문제 설명
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다.
예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.
자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
제한사항
- x는 1 이상, 10000 이하인 정수입니다.
A. 내가 푼 답
function solution(x) {
let arr = x.toString().split('')
let sum = 0
for(let i = 0; i < arr.length ; i++){
sum += Number(arr[i])
}
return x % sum == 0 ? true : false;
}
B. 다른 사람이 푼 답
자료형 변화없이 풀어가는 방법이 부러워서 가져왔습니다...🥲
function solution(x) {
let num = x;
let sum = 0;
do {
sum += x % 10;
x = Math.floor(x / 10);
} while (x > 0);
return !(num % sum);
}
solution(12) // true
1. do ... while문을 사용해서 x가 0보다 클 때까지 실행
2. x를 10으로 나눈 나머지 값을 sum에 누적
* 어떤 수를 10으로 계속 나누면 나머지자리가, 본 수의 1의 자리씩 떨어진다. (글로 쓰기 쉽지않네요...)
12는 너무 짧으니까, 좀 긴 수로 예시를 들어봅니다.
위 같은 그림에서 나머지 수를 조합하면 결국 1, 3, 4, 5 이렇게 한자리씩 나눈 것과 같은 결과이다.
이 값을 sum 변수에 누산하는 것이다.
5+4+3+2+1
모든 자리를 나눠서 배열로 만들어 작업하지 않아도 되는, 즉 형변화 없이 모든 자릿 수를 더할 수 있는 방법!
2. 여기서 x는 '10으로 나눈 값의 정수자리'
* 우리는 10으로 계속 나누는 계산을 이어나가기 위해 결과값도 필요하니까!
하지만 사실 그 결과는 나머지 수를 소수점 이하에 붙여 주는 형태라, Math.floor()를 사용해 정수만 남긴다.
solution(12)
// 'sum' 2
// 'x' 1
// 'sum' 3
// 'x' 0
3. !(num % sum)
✅ JS 개념 되집어보기
[진리 값을 false로 가지는 값들]
0
-0
null
false
NaN
undefined
""(빈 문자열)
이 외의 값들른 true
그러므로 0이라는 값을 false 라는 값으로 이용할 수 있음.
!false = true
!true = false
!0 // true
!1 // false
!2 // false
!3 // false
.
.
.
다른 사람 함수를 파헤치며 익힌 것들
- do ... while문
- 10으로 나눈 나머지값으로 모든 자리 수를 구할 수 있다는 로직 😨
- Math.floor
- false값을 가지는 값
'D.evelop [CS] > Algorithm' 카테고리의 다른 글
[Algorithm 025] JS - 콜라츠 추측 (Level 01) (0) | 2021.11.13 |
---|---|
[Algorithm 024] JS - 평균 구하기 (Level 01) (0) | 2021.11.11 |
[Algorithm 022] JS - 핸드폰 번호 가리기 (Level 01) (0) | 2021.11.09 |
[Algorithm 021] JS - 행렬의 덧셈 (Level 01) (0) | 2021.11.08 |
[Algorithm 020] JS - x만큼 간격이 있는 n개의 숫자 (Level 01) (0) | 2021.11.07 |
댓글