ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #AIL_23.11.24 // Programmers_하샤드 수
    AIL( Algorithm I Learned) 2023. 11. 24. 22:10

    ## AIL_하샤드 수

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

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

    *** 입출력 예
    x 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은 하샤드 수가 아닙니다.

    ## solution.JavaScript

    1. 문제의 접근 방식

    주어진 문제는 입력된 양의 정수 x가 하샤드 수인지 아닌지를 판별하는 것입니다. 하샤드 수는 주어진 수를 각 자리수의 합으로 나누었을 때 나누어떨어지는 수입니다. 


    2. 문제풀이

    function solution(x) {
        const num = x.toString(); // x를 문자열로 변환하여 각 자리수의 합을 계산하기 위해 num 변수에 저장합니다.
        let sum = 0; // 자릿수 합을 저장할 변수 sum을 선언하고 초기값을 0으로 설정합니다.
    
        // for 반복문을 사용하여 num의 각 자릿수를 순회하면서 각 자릿수를 정수로 변환하여 sum에 더합니다.
        for (let i = 0; i < num.length; i++) {
            sum += parseInt(num[i]);
        }
    
        // x의 자릿수 합인 sum으로 나누어 나머지가 0인지 확인, 나누어 떨어지면 true를 반환, 그렇지 않으면 false를 반환 
        if (x % sum === 0) {
            return true; // 나누어 떨어지면 true 반환
        } else {
            return false; // 나누어 떨어지지 않으면 false 반환
        }
    }
    
    /*
    테스트 1
    입력값 〉	10
    기댓값 〉	true
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	12
    기댓값 〉	true
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 3
    입력값 〉	11
    기댓값 〉	false
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 4
    입력값 〉	13
    기댓값 〉	false
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1. `x`를 문자열로 변환하여 각 자릿수의 합을 계산하기 위해 `num` 변수에 저장합니다.

     

    2. `sum`변수를 선언하여 각 자릿수의 합을 저장할 공간을 만듭니다. 

     

    3. `for` 반복문을 사용하여 `num`의 각 자릿수를 순회하면서 각 자릿수를 정수로 변환하여 `sum`에 더합니다. 

     

    4. `x`의 자릿수 합인 `sum`으로 나누어 나머지가 0인지 확인하여, 나누어 떨어지면 `true`를 반환하고, 그렇지 않으면 `false`을 반환합니다. 

     

    위 함수는 입력된 수가 하샤드 수인지 아닌지를 판별하여 `true` 또는 `false`를 반환합니다. 


     

    3. 다른사람의 문제풀이 및 접근방식 분석

    function solution(x) {
        return x%eval([...x.toString()].join("+")) ? false : true;
    }
    /*
    테스트 1
    입력값 〉	10
    기댓값 〉	true
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	12
    기댓값 〉	true
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 3
    입력값 〉	11
    기댓값 〉	false
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 4
    입력값 〉	13
    기댓값 〉	false
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1. `x.toString()` 입력된 숫자 x를 문자열로 변환합니다. 

     

    2. `[...x.toString()]` 문자열로 변환된 x를 배열로 분해합니다. 이는 각 자릿수를 배열 요소로 분해하는 작업입니다.

     

    3. `.join("+")` 배열 요소들을 "+" 문자로 연결하여 하나의 문자열로 만듭니다. 이렇게 하면 각 자릿수를 "+"로 연결한 문자열이 생성됩니다. 

     

    4. 'eval(...)' 문자열을 자바스크립트 표현식으로 평가합니다. 이 경우, 각 자릿수의 합으로 나눈 나머지를 계산합니다. 나머지가 0이면 true(하샤드 수), 그렇지 않으면 false를 반환합니다. 


    # 'eval()'에 대해 알아보자

    'eval()'은 자바스크립트에서 문자열로 표현된 JavaScript 코드를 실행하는 함수입니다. 이 함수를 사용하면 문자열로 표현된 JavaScript 코드를 실행하고 그 결과를 반환합니다. 즉, 문자열을 JavaScript 코드로 해석하고 실행하는 역할을 합니다.

     

    예를 들면 

    const x = 10;
    const y = 20;
    const result = eval("x + y"); // 문자열 "x + y"를 JavaScript 코드로 해석하여 실행
    console.log(result); // 30을 출력

     

    `eval()`은 문자열로 표현된 JavaScript 코드 "x + y"를 해석하여 현재 스코프 내의 변수 `x`와 `y`의 값을 더한 결과를 반환합니다. 


    # `eval()`을 사용하는 것은 강력하지만 동시에 주의해야 할 점

     

    1. 보안문제

    사용자로부터 입력 등 외부에서 전달된 문자열이 `eval()`에 들어가면 악의적인 코드가 실행될 수 있습니다. 이로 인해 보안 취약점이 발생할 수 있으므로 외부에서 오는 문자열은 `eval()`로 실행하지 않는 것이 좋습니다. 

     

    2. 성능 저하

     'eval()'은 실행 시점에 동적으로 코드를 해석하고 실행하기 때문에 일반적인 코드 실행보다 느릴 수 있습니다. 

     

    3. 디버깅 어려움

    'eval()'을 사용하면 코드가 동적으로 생성될 수 있기 때문에 디버깅이 어려울 수 있습니다. 오류가 발생했을 때 원인을 파악하기 어려울 수 있습니다. 

     

    따라서 `eval()`을 사용하는 것은 보안 문제와 코드의 가독성, 유지보수성 등을 고려하여 신중하게 사용해야 합니다. 가능한 경우에는 `eval()`을 대체할 수 있는 다른 방법을 사용하는 것이 좋습니다. 

     

     

     

Designed by Tistory.