오늘자 알고리즘에서 사용된 Math
함수와 isInteger
메서드,
sort
메서드에 대해 알아보자.
Math.pow(x, y)
함수는 숫자 x
에 대한 y
제곱 값을 반환한다.
Math.pow
함수를 이용한 결과는 다음과 같다.
Math.pow(7, 3); //343
Math.pow(4, 0.5); //2
Math.pow(7, -2); //0.02040816326530612 === 1/49
Math.pow(-2, 3); //-8
Math.pow(-4, 0.5); //NaN
Math.pow(-4, -2); //0.0625
Math.pow(x, y)
에서 x
가 음수일 때, y
에 소수를 대입하면 NaN
이 나온다.
Math.sqrt(x)
함수는 숫자 x
에 대한 제곱근 값을 반환한다.
Math.sqrt
함수를 이용한 결과는 다음과 같다.
Math.sqrt(9); // 3
Math.sqrt(2); // 1.414213562373095
Math.sqrt(1); // 1
Math.sqrt(0); // 0
Math.sqrt(-1); // NaN
Number.isInteger(x)
메서드는 숫자 x
가 정수인지 아닌지를 판별해준다.
Number.isInteger
메서드를 이용한 결과는 다음과 같다.
Number.isInteger(0); // true
Number.isInteger(1); // true
Number.isInteger(-100000); // true
Number.isInteger(99999999999999999999999); // true
Number.isInteger(0.1); // false
Number.isInteger(Math.PI); // false
Number.isInteger(NaN); // false
Number.isInteger(Infinity); // false
Number.isInteger(-Infinity); // false
Number.isInteger('10'); // false
Number.isInteger(true); // false
Number.isInteger(false); // false
Number.isInteger([1]); // false
Array.sort()
메서드는 Array
배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환한다.
Array.sort()
메서드를 사용해본 결과, 몇 가지 주의 사항이 있다.
1. 기본적으로 정렬은 첫 번째 자리의 단어 혹은 숫자 기준 오름차순으로 이뤄진다.
let array1 = [3, 5, 2, 1];
array1.sort();
console.log(array1); //[1, 2, 3, 5]
let array2 = [1, 100, 3, 2];
array2.sort();
console.log(array2); //[1, 100, 2, 3]
let array3 = ['A', 'B', 'ABC', 'C'];
array3.sort();
console.log(array3); //['A', 'ABC', 'B', 'C']
2. Array.sort()
메서드는 한 번이라도 실행되면 해당 배열을 정렬한다.
이게 무슨 말이냐면, 새로운 변수를 선언하고 해당 변수에 기존의 배열을 정렬한 형태를 할당하려고 메서드를 사용하면, 원본 배열도 정렬된다는 것이다.
다음의 코드가 이해를 도울 수 있지 않을까 생각한다.
let array1 = [3, 5, 2, 1];
//새로운 변수 array2 에 정렬된 array1 를 할당하고자 한다.
let array2 = array1.sort();
//변수에 할당할 때 sort 메서드를 사용하여 기존 배열에 적용된 것을 확인할 수 있다.
console.log(array2); //[1, 2, 3, 5]
console.log(array1); //[1, 2, 3, 5]
그렇기에 위의 코드에서 array1
은 [3, 5, 2, 1]
그대로 두고,
array2
에 [1, 2, 3, 5]
를 할당하고 싶다면
array1
을 우선 그대로 array2
에 할당하고, array2
에서 정렬을 시도해야 한다.
3. 괄호 안에 함수를 작성하면 정렬 기준을 설정할 수 있다.
첫 번째 주의 사항에서 배열이 첫 번째 자리를 기준으로 정렬된다는 것을 확인했다.
하지만 [1, 100, 2, 3]
배열을 [1, 2, 3, 100]
과 같이 수의 크기로 정렬하고 싶다면 Array.sort()
메서드의 괄호 안에 함수를 작성해주면 된다.
let array1 = [1, 100, 2, 3];
array1.sort(function(a, b) {
return a-b;
});
//array1.sort((a, b) => a-b);
console.log(array1); //[1, 2, 3, 100]
오름차순으로 정렬하고 싶다면 Array.sort((a, b) => a-b);
를,
내림차순으로 정렬하고 싶다면 Array.sort((a, b) => b-a);
를 사용하면 된다.
Array.sort()
의 괄호안에 왜 저렇게 넣으면 오름차순이, 왜 저렇게 넣으면 내림차순이 나오는지 자세하게 이해하고 싶다면 이 블로그 내용을 참조하도록 하자.
간단하게 얘기하자면, Array.sort(function => return);
에서
return >= 0
이면 배열은 그대로 유지되며, return < 0
일 경우 배열은 재정렬된다.
위의 예시를 바탕으로 array1
은 [1, 100, 2, 3]
의 배열을 값으로 지닌다.
그리고 array1.sort((a, b) => a-b);
메서드의 작동 순서는 다음과 같다.
//Array.sort(next, prev) => next-prev);
가장 먼저 a
에는 다음 값, 즉 100
이 대입되고, b
에는 현재 값 1
이 대입된다.
그러면 a-b
의 결과는 99으로 양수다. 그렇기 때문에 1
과 100
은 그대로 자리를 유지한다.
//[1, 100, 2, 3]
그 다음으로, a
에는 다음 값인 2
가 대입되고, b
에는 현재 값인 100
이 대입될 것이다.
그러면 a-b
의 결과는 -98으로 음수다. 그렇기 때문에 100
과 2
는 자리가 바뀌게 된다.
//[1, 2, 100, 3]
이러한 순서로 계속해서 다음 칸으로 넘어가며 값들이 오름차순으로 정렬되는 것이다.
위 개념을 바탕으로 array1.sort((a, b) => b-a);
가 왜 내림차순으로 정렬되는지도 이해했을 것이라 생각한다.
오랜만에 함수들과 메서드들을 쓰니 은근히 헷갈리는 개념들이 많다.
역시 개발은 끊임없이 공부하며 사용해봐야 하는 것 같다.
앞으로도 알고리즘들을 풀어가며 새롭게 알게 된 함수들이나 메서드들을 정리해보자!