프로그래머스/level 1

[프로그래머스] 하샤드 수

binaryJournalist 2021. 7. 23. 20:02
반응형

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

 

 

 

** Javascript

 

 

1) 나의 첫번째 풀이는 이렇다.

 

function solution(x) {
    const arrX = `${x}`.split("").map((n) => parseInt(n));
    let sum = 0;
    for (const num of arrX) {
        sum += num;
    }
    
    return !(x % sum);
}

 

 

2) reduce 를 좋아하는 지금의 나

 

function solution(x) {
    return !( x % `${x}`.split("").reduce((acc, curr) => {
        acc += parseInt(curr);
        return acc;
    }, 0));
}

 

욕심을 버리고 가독성 있게 정리하면

 

function solution(x) {
    const sum = `${x}`.split("").reduce((acc, curr) => {
        acc += parseInt(curr);
        return acc;
    }, 0);
    return !( x % sum);
}

 

이렇게 된다.

 

 

다른 사람들의 풀이를 보면

 

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function Harshad(n){
  return !(n % (n + "").split("").reduce((a, b) => +b + +a ));
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log(Harshad(148))

 

reduce 안 람다 함수를 더 알아봐야겠다.

 

 

하지만 숫자를 string array 를 바꿔서 푸는 것은 아무래도 효율이 떨어진다고 한다.

 

아래는 속도를 우선시 한 사람의 풀이다.

 

function solution(x) {
    let num = x;
    let sum = 0;
    do {
        sum += x % 10;
        x = Math.floor(x / 10);
    } while (x > 0);

    return !(num % sum);
}

 

 

그리고 재귀함수의 달인의 풀이다.

 

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

 

 

속도는 느리지만 처음 보는 함수가 있어 가져온 풀이다.

 

function solution(x) {
    return x % eval([ ...x.toString() ].join("+")) ? false : true;
}

 

 

 

** Java

 

 

 

javascript 로는 string 으로 바꿔서 풀었는데 형변환의 경우 시간이 오래 걸린다고 해서 java는 정수로만 해결했다.

 

 

class Solution {
    public boolean solution(int x) {
        int divisor = 0;
        int newX = x;
        while (newX > 0) {
            divisor += newX % 10;
            newX /= 10;
        }
        return x % divisor == 0;
    }
}

 

javascript 의 경우 숫자 형태를 정해주지 못해서 parseInt 를 해야 하는데 java의 경우 int 형으로 바로 선언하니까 편했다.

 

계속 나눠도 몫만 newX에 담긴다.

 

 

숫자로 계산하여 푼 경우 거의 동일하게 푼 것 같다.

 

 

** Python 의 경우 divmod() 함수를 한 번 이용해 보자

 

divmod 는 몫과 나머지를 (몫, 나머지)의 튜플 형태로 return 해주는 python 내장함수이다.

 

x = divmod(a, b)

 

x 값으로 (a // b, a % b) 가 리턴된다.

반응형