-
#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()`을 대체할 수 있는 다른 방법을 사용하는 것이 좋습니다.
'AIL( Algorithm I Learned)' 카테고리의 다른 글
#AIL_23.11.28 // Programmers_콜라츠 추측 (1) 2023.11.28 #AIL_23.11.27 // Programmers_두 정수 사이의 합 (1) 2023.11.27 #AIL_23.11.23 // Programmers_월간 코드 챌린지 시즌1 > 내적 (0) 2023.11.23 #AIL_23.11.22 // Programmers_부족한 금액 계산하기 (2) 2023.11.22 #AIL_23.11.21 // Programmers_핸드폰 번호 가리기 (1) 2023.11.21