본문 바로가기
D.evelop [CS]/Algorithm

[Algorithm 023] JS - 하샤드 수 (Level 01)

by Danne 2021. 11. 10.

문제 출처 : 프로그래머스 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값을 가지는 값

 

 

 

 

반응형

댓글