하샤드 수 - 숫자로 처리 vs 문자열로 처리

조해빈·2022년 12월 29일
0

프로그래머스

목록 보기
6/15

문제 설명
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다.
예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.
자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

제한사항
x는 1 이상, 10000 이하인 정수입니다.

풀이 과정

function solution(x) {
    let sum = 0;
    do {
        sum += x%10;
    } while (x >= 1);
    (x/sum)? false : true ;
}


영원히 끝나지 않는 식이라는 걸 알고 얼른 정수 x에 대한 조치를 취했다.
그런데도

function solution(x) {
    let sum = 0;
    do {
        sum += x%10;
        x = Math.floor(x/10);
    } while (x >= 1);
    (x/sum)? {return false} : {return true}
}


잘 쓴 것 같은데 자꾸 이런 식으로 틀려서 황당이 찢어졌다. 두 번째 풀이에서 왜 return 이 안 되는 건지도 의아했다.
우선 삼항연산자를 빼고 기본 if문으로 바꾼 뒤 while (x > 0);로 바꾸었다.

전부 true가 나오는 상황. 전부 false도 아니고 전부 true가 나오는 오류라니...
그러나 콘솔로 확인을 해보니 금방 알게 되었다.

function solution(x) {
    let sum = 0;
    do {
        sum += x%10;
        x = Math.floor(x/10);
    } while (x > 0);
    if (x%sum === 0) { console.log(x, sum); return true; } else { console.log(x%sum); return false; }
}


위에서 이미 인자 x가 다른 값으로 변형되어 있었으므로 원하는 대로 진행되지 않고 있었던 것이다.
그래서 그냥 변수 선언을 한 번 더 했다.

function solution(x) {
    let sum = 0;
    let tar = x;
    do {
        sum += x%10;
        x = Math.floor(x/10);
    } while (x > 0);
    if (tar%sum === 0) { return true; } else { return false; }
}


어쨌던 테스트가 통과되었다.
다른 분들의 풀이를 보았는데 다른 문제들처럼 많은 사람들이 공통적으로 제출한 답안이 없어 보였다.
이번엔 거의 대놓고 수리 문제였어서 그런지 풀이법이 되게 많이 나뉜 것 같아 보였다.
많은 분들이 string()을 해서 푸시는데 짧게 쓸 수 있어서 그런 건가 모르겠다. 댓글에 다들 그러면 속도 느려진다고 악플 달려 있는 게 웃겼다.

1

어진씨가 또 재귀를...

function solution(x,i=0,sum=0) {
    return String(x).length==i?x%sum==0:solution(x,i+1,sum + String(x)[i]*1);
}

2

function solution(n){
  return !(n%(n+'').split('').reduce(function (i, sum) {return +sum + +i;}));
}

3

function solution(n){
  return !(n % (n + "").split("").reduce((a, b) => +b + +a ));
}

profile
UE5 공부하는 블로그로 거처를 옮겼습니다!

0개의 댓글