프로그래머스/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) 가 리턴된다.
반응형