문제
어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return 하도록 solution 함수를 완성해 주세요.
제한사항
- 1 ≤ n ≤ 1,000,000
입출력 예
n | result |
144 | 1 |
976 | 2 |
입출력 예 #1
144는 12의 제곱이므로 제곱수입니다. 따라서 1을 return 합니다.
입출력 예 #2
976은 제곱수가 아닙니다. 따라서 2를 return 합니다.
내가 작성한 답안
function solution(n) {
let arr = [];
for(let i = 1; i <= n; i++) if(n % i === 0) arr.push(n / i);
return arr.length % 2 ? 1 : 2;
}
정수 n이 제곱된 수임을 어떻게 판별하지? 가 관건이었는데, 도무지 떠오르지 않아 제곱수 판별 방법에 대해 찾아보았다. 제곱수의 성질은 다음과 같다.
[제곱수의 성질]
제곱수란, 어떤 자연수를 제곱하여 구해지는 수를 말한다. ex. 1, 4, 9, ... 36, 49, ...
1. 제곱수의 약수의 개수는 항상 홀수이다.
16의 약수를 구해보면, 1, 2, 4, 8, 16인데, (1, 16), (2, 8), (4, 4)로 모두 순서쌍 이루는 수 중 4는 스스로를 제곱하여 곱하는 것이므로 중복되는 수를 빼면 항상 홀수가 나오게 된다.
2. 그중에서도 소수의 제곱은 약수가 반드시 세 개다.
소수는 2, 3, 5, 7, ..., 17, 19 등 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수를 말한다. 따라서 소수의 약수는 1과 자기 자신, 총 2개이며 이를 제곱했을 경우 1, (소수)², 자기 자신(소수)만을 약수로 가지기 때문에 소수의 제곱은 약수가 반드시 세 개가 된다. 예를 들어, 소수인 2의 제곱값인 2² = 4의 약수는 1, 2, 4이므로 약수의 개수는 3개이다.
이에 따라 위와 같이 숫자 1부터 n까지 for문을 돌려 나눠보며 나머지값이 없는 값(약수)을 찾아 배열에 넣었다. 그 후, 배열의 길이가 홀수라면(제곱수라면) 1을, 아니라면 2를 리턴했다.
다른 사람들이 작성한 답안
function solution(n) {
return Math.sqrt(n) % 1 === 0 ? 1 : 2;
}
혹시나 싶어 자바스크립트 함수는 따로 찾아보지 않고 제곱수 성질만 찾아본 뒤 문제를 풀었는데, 역시나 제곱수 판별 함수가 있었다. 지금까지 아는 지식만 동원해서 문제를 어떻게든 풀어보는 게 좋을지, 간단하게 풀어낼 수 있는 함수가 있다면 해당 함수를 찾아서 사용하는 게 좋을지 아직 판단이 어렵다.
Math.sqrt()
주어진 숫자에 루트(√ )를 씌워 숫자의 제곱근을 반환한다. 만약 주어진 숫자가 음수이면 NaN을 반환한다.
Math.sqrt(9); // 3
Math.sqrt(2); // 1.414213562373095
Math.sqrt(1); // 1
Math.sqrt(0); // 0
Math.sqrt(-1); // NaN
Math.sqrt값이 꼭 정수를 반환하는 것은 아니고 위와 같이 실수로도 값을 반환하므로, 위 답안과 같이 1로 나눴을 때의 나머지가 0이거나 (= 정수), isInteger()를 사용해 해당 값이 정수인지를 판별해야 한다.
Number.isInteger()
주어진 값이 정수인지 판별한 뒤 boolean(True, False)으로 값을 반환한다. 주어진 매개변수의 값이 NaN(Not of Number)이거나 Infinity(무한)이여도 false를 반환한다.
[참고 자료]
https://school.programmers.co.kr/learn/courses/30/lessons/120909
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jihoon0023&logNo=120151386215
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
'Front-End > Algorithm' 카테고리의 다른 글
[프로그래머스 / JavaScript] Lv.0 합성수 찾기 (0) | 2023.03.18 |
---|---|
[프로그래머스 / JavaScript] Lv.1 두 개 뽑아서 더하기 (0) | 2023.03.16 |
[프로그래머스 / JavaScript] Lv.1 문자열 내 마음대로 정렬하기 (0) | 2023.02.15 |
[프로그래머스 / JavaScript] Lv.1 최소직사각형 (0) | 2023.02.14 |
[프로그래머스 / JavaScript] Lv.0 숫자 비교하기 (0) | 2023.01.26 |