Front-End/Algorithm

[프로그래머스 / JavaScript] Lv.0 제곱수 판별하기

Olivia Kim 2023. 2. 21. 15:05
반응형

 

문제

어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jihoon0023&logNo=120151386215 

 

소인수분해 ; 제곱수가 갖는 성질

제곱수란? 어떤 자연수를 제곱하여 구해지는 수를 말합니다. 1, 4, 9, 16, 25, 36, 49, ...... 등이 제곱수...

blog.naver.com

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt

 

Math.sqrt() - JavaScript | MDN

Math.sqrt() 함수는 숫자의 제곱근을 반환합니다.

developer.mozilla.org

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger

 

Number.isInteger() - JavaScript | MDN

Number.isInteger() 메서드는 주어진 값이 정수인지 판별합니다.

developer.mozilla.org

 

 

반응형