임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
n | return |
---|---|
121 | 141 |
3 | -1 |
function solution(n) {
let x = Math.sqrt(n);
if (n % x === 0) {
return Math.pow(x + 1, 2);
}
return -1;
}
먼저 변수 x를 임의의 양의 정수 n에 대한 제곱근으로 두고 그 수를 x로 나눈 나머지가 0일 경우 Math.pow 메소드를 이용해 제곱을 하여 리턴하도록 하였다. 결국 제곱수로 나누면 나누어 떨어지기 때문이다.
function solution(n) {
const x = Math.sqrt(n);
return x % 1 === 0 ? (x+1)**2 : -1;
}
나와 똑같은 로직이지만, 삼항연산자를 활용한 점 그리고 나머지를 판단하는 부분이 다르다. 딱 떨어지는 수를 1로 나눈 나머지는 항상 0이기 때문에 이외의 경우는 -1을 리턴하면 된다. 예를 들면, 3의 제곱근은 소수점이 나오기 때문에 1로 나눈 나머지가 0이 될 수 없다.
삼항연산자를 사용하니 훨씬 코드가 깔끔해 보이는데 삼항연산자를 활용할 수 있도록 더 열심히 해야겠다.
주어진 2차원 배열을 1차원 배열로 바꾼 후 각 요소를 반전시키는 문제이다.
var arr1 = [[2, 1], [4, 3]];
var arr2 = [[3, 2, 1], [5, 4], [6]];
var arr3 = [[3], [4, 5], [6], [7], [8, 9, 10]];
function restoreArray(arr) {
return arr.reverse().join(',').split(',').reverse();
}
// 결과값
// 1. ["1", "2", "3", "4"]
// 2. ["1", "2", "3", "4", "5", "6"]
// 3. ["3", "5", "4", "6", "7", "10", "9", "8"]
reverse 메소드를 이용하여 각 요소들을 반전시킨 후 join 메소드로 ','로 구분하여 문자열로 만든 후 다시 ','를 기준으로 배열로 변환 후 다시 reverse로 반전시켜 최종 값을 얻어냈다.
function restoreArray(arr) {
var returnArr = [];
for (var i = 0; i < arr.length; i++) {
var value = arr[i].reverse();
for (var j = 0; j < arr[i].length; j++) {
returnArr.push(value[j]);
}
}
return returnArr;
}
이중 for문을 구성하여 풀었다. 먼저 빈 배열을 만든 후 arr의 length만큼 for문을 돌려 i번째 요소들을 반전시켜 value에 저장 후 다시 그 값의 length만큼 반복문을 돌려 빈 배열에 value에 저장된 요소들을 추가하였다. 두 번째 반복문에서 arr[i].length;를 value.length;로 바꿔서 적었으면 조금 더 가독성이 좋아지지 않을까 하는 생각을 조심스럽게 해본다..
function restoreArray(arr) {
var returnArr = [];
var idx = 0;
for (var i = 0; i < arr.length; i++) {
for (var j = arr[i].length - 1; j >= 0; j--) {
returnArr[idx] = arr[i][j];
idx++;
}
}
return returnArr;
}
첫 번째 코드와 로직은 거의 비슷한 것 같다. 대신에 reverse 메소드를 사용하지 않고 idx라는 임의의 인덱스를 변수로 선언한 후 시작점을 arr[i].length - 1 로 설정 해주면서 j 값이 감소하는 반복문을 통해 인덱스를 증가시키면서 요소들을 차례대로 넣어주었다. 역시 다른 사람들이 짠 코드를 보는게 도움이 되는 것 같다. 이런식으로도 짤 수 있구나 하고 깨달음을 얻게해준다.