양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 함. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해야 함.
function solution(x) {
var answer = true;
let temp, sum = 0;
// 모든 자릿수 숫자를 더해야하기 때문에 일의 자리의 수는 10으로 나눈 나머지를,
// 백의 자리 수는 (x / 100)에서 (x / 1000) * 10를 빼고 sum에 더해주고,
// 십의 자리 수는 (x / 10)에서 (x / 100) * 10을 빼고 sum에 더해주는 식으로
// 코드 구성
if(x < 10000) {
for(let i = 1000; i >= 10; i /= 10) {
// 몫이 10이 넘을 때만 위의 주석대로
if(Math.floor(x / i) >= 10) {
sum += Math.floor(x / i) - 10*(Math.floor(x / (i*10)));
}
// 10이 넘이 않으면 그냥 sum에 더해줌
else
sum += Math.floor(x / i);
}
sum += (x % 10);
answer = (x % sum) ? false : true;
}
else // x가 10000일때는 무조건 true.
answer = true;
return answer;
}
ㅋ 상당히 복잡하다..
그렇지만 지금 내 머릿속에 있는 것들로는 이게 최선인 것 같다...
코드 설명은 위의 주석들을 참고하면 된다.
function solution(arr)
{
for(let i = 0; i < (arr.length-1); i++) {
for(let j = (i+1); j < arr.length; j++) {
if(arr[i] === arr[j]) {
arr.splice(j, 1);
j--;
}
else
break;
}
}
return arr;
}
j--;
가 제일 관건이었다.
arr가 [5, 5, 5, 6, 3] 이라고 가정해보자.
if문에서 arr[0]과 arr[1]을 비교하고, 같으면 arr[1]을 제거한다. 주어진 arr에서는 arr[0], arr[1], arr[2]가 전부 5로 같기 때문에 일단 arr[1]의 5는 제거가 된다.
이 때 문제는 다음번의 5가 arr[1]이 되는데 arr[1]은 이미 한 번 비교를 했기 때문에 원래 arr[1]에 있던 5는 제거가 되지만, 그 다음에 arr[1]이 된 5는 제거가 되지 않는다.
따라서 j를 하나 감소해주어 제거가 된 인덱스에 들어온 수부터 다시 비교하게끔 만들어주었다.
여기서 또 문제는 테스트는 다 통과했는데 효율성 테스트가 전부 fail이 떴다는 것이다.. 허허................ 언젠간 이것도 해결할 수 있을만큼 머리가 자바스크립트로 가득 차겠지ㅎㅎㅎ