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

hyocho·2022년 6월 9일
0

코딩테스트

목록 보기
6/45
post-thumbnail

✅문제

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

  • 제한 조건
    x는 1 이상, 10000 이하인 정수입니다.

  • 입출력 예 설명
    입출력 예 #1
    10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.

입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.

입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.

입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.

💡주어진 솔루션

function solution(x) {
    var answer = true;
    return answer;
}

✍문제풀이

function solution(x) {
    let sum = 0;
  //sum 이라는 변수 설정
    let arr = String(x).split("");
  // 입력받는 정수 x를 String(x)로 문자열로 형변환 해준 후, 한글자씩 나누고 arr라는 배열에 대입해준다. 

    for(let i = 0; i < arr.length; i++){
        sum += Number(arr[i]);
    }
  //arr의 인덱스 하나씩 올려주면서 각 원소들을 sum에 더해준다.

    return (x % sum == 0) ? true : false;
  // x를 sum으로 나눈 나머지가 0 이면 true, false 가 반환되는 삼항연산자로 마무리
}

C언어를 사용할 때에는 두 자리 이상의 숫자는 모두 10으로 나누어서 자르는 방법으로 끊었기 때문에 처음에는 그와 같이 생각했었다. 정수를 자리수로 취급해서 더해야 하므로 문자열로 변경하는 과정이 필요하고(아래 참고 사이트에 첨부) , 그 후 반복문을 사용해서 더해주기.

07.01 수정

function solution(x) {
  let sum = 0;
  let arr = String(x).split('');
  for(let i = 0; i<arr.length; i++){
      sum += Number(arr[i]);
  }
  return x%sum == 0? true : false;
}

복습하면서 계속 오류가 났는데, sum += Number(arr[i]) 부분을 계속 arr[i]라고 적어주었기 때문이다. 위에서 형변환으로 문자열 상태이기 때문에 Number로 다시 형변환해서 sum 에 넣어주어야 한다.

✔️참고할 좋은 코드

function solution(x) {
    let answer = true;
 
    let tempArr = []
    let num = String(x)
 
    for(let i = 0; i < num.length; i++) {
        tempArr.push(Number(num[i]));
    }
 
    let sum = tempArr.reduce((a, b) => (a + b))
 
    if (!(x % sum === 0)) {
        answer = false;
    }
 
    return answer;
}
function solution(x){
  let num = x;
  let sum = 0;
  do {
    sum += x%10;
    x = Math.floor(x/10);
  } while (x>0);
  
  return !(num%sum);
}

do .. while 은 테스트 조건이 거짓으로 평가될 때까지 지정된 구문을 실행한다. 각 자리수는 문자열로 변환해서 더하는 것이 아니라, 처음에 내가 착안했던 것처럼 정수를 10으로 나누고 자리수를 10씩 줄이면서 Math.floor()로 버림하여 각 자리수를 더한다.

📝TIL

  • String(x).split('')을 사용하면 한 번에 문자열을 잘라서 배열에 저장할 수 있다. 값을 입력하지 않으면 문자열 전체가 배열에 return된다.
  • 정수를 문자열로 형변환하기
  • 삼항연산자

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/12947
도움되었던 사이트 :
1. https://hianna.tistory.com/491
2. https://velog.io/@yujin1760/javascriptsplit-%ED%95%A8%EC%88%98
3. https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Conditional_Operator

profile
기록하는 습관을 기르고 있습니다.

0개의 댓글