문제 설명
순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 1,000,000
입출력 예nresult
20 | 6 |
100 | 9 |
입출력 예 설명
입출력 예 #1
- n이 20 이므로 곱이 20인 순서쌍은 (1, 20), (2, 10), (4, 5), (5, 4), (10, 2), (20, 1) 이므로 6을 return합니다.
입출력 예 #2
- n이 100 이므로 곱이 100인 순서쌍은 (1, 100), (2, 50), (4, 25), (5, 20), (10, 10), (20, 5), (25, 4), (50, 2), (100, 1) 이므로 9를 return합니다.
function solution(n) {
let pairNum = 0
for(var i = 1; i <= n; i++){
n % i === 0 ? pairNum++ : 0
}
return pairNum
}
저는 살짝 꼼수를 부려서 해결 했지만, 순서쌍의 개수가 아닌 숫서쌍을 반환하라는 문제였다면 코드 내용이 조금 바뀌어야 할 것 같습니다.
만약 곱20인 순서쌍을 반환하시오 였다면을 생각해서 코드를 구현해보면.
function solution(n) {
let pairNumList = []
for(var i = 1; i <= n; i++){
if(n % i === 0 ){
pairNumList.push([i,n/i])
}
}
return pairNumList
}
이런 식으로 구현했을 것 같습니다. 하지만 유효성에서 좋은 결과물을 가져올 수 있을지 고민입니다.
다른 분들의 코드로 공부하던중 유효성 부분에서 가장 좋을것 같은 코드를 정리하려고 합니다.
function solution(n) {
let ans = 0;
for (let i = 1; i < Math.sqrt(n); i++)
if (n%i === 0) ans+=2;
return Number.isInteger(Math.sqrt(n)) ? ans+1 : ans;
}
Math.sqrt는 제곱근을 반환해 주는 JS내장 메소드입니다.
isInteger은 숫자가 실수인지 정수인지를 판별해 주는 메서드입니다.
절반만큼만 실행시켜줘도, 순서쌍의 개수를 구할 수 있는 코드입니다. (1,20)(20,1)은 같은 거니까요. 그리고 만약 Math.sqrt가 정수라면 (10,10)과 같이 곱하는 수가 있으니, Number.isInteger(Math.sqrt(n))가 참인지 거짓인지 판단해 참이면 +1을 해주고 ans를 return 해주고 그렇지 않으면 그냥 ans를 리턴해주는 것 같습니다. 제가 짠 코드보다 절반 정도 for문을 덜 도니 효율성 측면에서는 아주 좋은 것 같습니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트]주사위의 개수 (0) | 2022.10.27 |
---|---|
[코딩테스트]배열 회전 시키기 (0) | 2022.10.18 |
[코딩테스트] 배열의 유사도 (0) | 2022.10.15 |
[코딩테스트] 제곱수 판별하기 (0) | 2022.10.15 |
[코딩테스트] 가위 바위 보 (0) | 2022.10.14 |