Ethan(기린)
그린기린그림 일기
Ethan(기린)
전체 방문자
오늘
어제
  • 전체보기 (43)
    • Language (4)
      • JavaScript (4)
    • Web (0)
      • HTML (0)
    • Problem Solving (29)
      • BOJ (18)
      • 프로그래머스 (10)
    • Computer Science (3)
      • Algorithm & Data Structure (2)
      • Network (1)
    • Error Log (4)
    • Config (1)
      • Test (1)
    • Thinking (2)
      • Retrospect (2)
      • Essay (0)
    • Book (0)

인기 글

최근 글

최근 댓글

태그

  • 문자열
  • Lv. 1
  • Problem Solving
  • boj
  • 객체 지향 프로그래밍
  • JavaScript
  • Java
  • Object-oriented programming
  • 알고리즘
  • Lv. 2
  • OOP
  • 프로그래머스
  • Java의 정석 3rd Edition
  • 완전탐색
  • 백준

티스토리

hELLO · Designed By 정상우.
Ethan(기린)

그린기린그림 일기

[ Lv. 1 ]  하샤드 수 - JavaScript
Problem Solving/프로그래머스

[ Lv. 1 ] 하샤드 수 - JavaScript

2022. 6. 10. 23:28

문제 설명

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

제한 조건

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

입출력 예

arr return
10 true
12 true
11 false
13 false

입출력 예 설명

  • 입출력 예 #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) {
    let answer = true;
    
    const str = x.toString();
    let sum = 0;
    for(let i = 0; i < str.length; i++){
        sum += Number(str[i]);
    }
    
    return x % sum == 0;
}

문제 해결 과정

먼저 하샤드 수라는 것에 대한 정의가 필요하다. 위에 문제 설명 그대로 하샤드의 수는 "x라는 양의 정수에 각 자릿수 합을 더한 값으로 x가 나누어 떨어지는 수"이며, 문제의 출력 결과는 입력에 대한 값에 대해 하샤드의 수인지 판별하는 문제로 파악했다.

수가 맞는지에 대한 참 혹은 거짓의 결과를 알려주면 되기 때문에 받은 인자의 x 값을 각 자릿수로 해서 그 값을 모두 더하고, 그 결과를 x와 나누어 떨어지는지에 대한 식을 세우기로 했다.

내 경우에는 숫자의 값을 문자열로 바꾸고, 그것을 문자열의 인덱스마다 sum에 더해준 다음에 return에서 x와 sum이 나누어 떨어지는지 평가해서 answer의 값이 바뀌도록 했다.

다른 방법 ( 숫자 연산을 이용한 방법 )

또 다른 것을 생각했을 때는 우선 x의 원본 값을 다른 변수에 저장해 둔 후 x의 값을 10으로 나누어서 각 자릿 수가 0이 될 때 까지 sum에 더하고, 기존 x의 값은 10을 나누고 소숫점은 버림으로써, 반복문이 유한하게 반복되도록 처리하고, 자릿수가 0이 되어 return 문에 도달하면 저장해둔 원본 값이 담긴 x와 자릿수의 총 합산을 나누어 true인지 false인지 비교했을 것 같다. ( 아무래도 숫자로 접근하는 쪽이 실행 속도는 더 빠르다, 그 이유는 형변환 과정과 배열을 만드는 과정이 추가되기 때문이다. )

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

    return !(num%sum);
}

다른 사람 풀이

먼저 n을 문자열로 만든 후, split을 이용해서 배열을 만든 다음 reduce로 합을 구하는 방식으로 보다 간결하게 구하는 코드를 참조할 수 있었다. 중간에 reduce 인자가 반환 값에서 더하는 연산을 하는 것은 현재 a와 b의 값이 string type으로 이를 number tpye으로 변환하는 연산에 의한 묵시적인 형변환을 수행하는 과정이다. (마찬가지로 앞에 n + '' 의 연산도 string type으로 묵시적인 형변환을 수행한다.)

코드가 간결하지만 무엇을 의미하는 코드인지 한 눈에 파악하기 힘들어서, 짧은 코드가 이해하기 쉽고 좋은 코드는 아니라는 생각이 들었다. 그래도 한 줄로 메서드를 잘 활용해서 구현한다는 부분에서 "이런 방식도 있구나" 하고 참고가 됐다.

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

 

저작자표시 비영리 (새창열림)

'Problem Solving > 프로그래머스' 카테고리의 다른 글

[ Lv. 2 ] 소수 찾기 - JavaScript  (0) 2022.06.25
[ Lv. 1 ] 모의고사 - JavaScript  (0) 2022.06.25
[ Lv. 1 ] 최대공약수와 최소공배수 - JavaScript  (0) 2022.06.11
[ Lv. 1 ] 핸드폰 번호 가리기  (0) 2022.06.11
[ Lv. 1 ] 직사각형 별 찍기 - JavaScript  (0) 2022.06.10
    'Problem Solving/프로그래머스' 카테고리의 다른 글
    • [ Lv. 1 ] 모의고사 - JavaScript
    • [ Lv. 1 ] 최대공약수와 최소공배수 - JavaScript
    • [ Lv. 1 ] 핸드폰 번호 가리기
    • [ Lv. 1 ] 직사각형 별 찍기 - JavaScript
    Ethan(기린)
    Ethan(기린)

    티스토리툴바