백준 10818번을 토대로 주어진 숫자들의 최대, 최소를 구하는 방법을 정리해보려고 한다.
1. min을 주어진 범위의 최댓값으로, max를 주어진 범위의 최솟값으로 설정
let [N, numbers] = require('fs').readFileSync('/dev/stdin').toString().split('\n')
numbers = numbers.split(' ').map(Number)
let max = -1000000
let min = 1000000
for (const number of numbers) {
if (max < number) max = number
if (number < min) min = number
}
주어진 조건에 따르면 각 정수는 -1,000,000 이상, 1,000,000 이하이므로
min을 1,000,000으로, max를 -1,000,000으로 초기화하였다.
2. Math 객체의 min, max 메소드
let [N, numbers] = require('fs').readFileSync('/dev/stdin').toString().split('\n')
numbers = numbers.split(' ').map(Number)
max = Math.max(...numbers)
min = Math.min(...numbers)
console.log(`${min} ${max}`)
Math 객체의 min, max 메소드는 배열이 아닌 여러 개의 숫자를 입력으로 받아 각각 최솟값, 최댓값을 반환한다.
때문에 Math.max(...numbers)와 같이 전개 연산자를 사용해 인수를 전달하였다.
3. Array 객체의 sort 메소드
let [N, numbers] = require('fs').readFileSync('/dev/stdin').toString().split('\n')
numbers = numbers.split(' ').map(Number)
numbers.sort((a, b) => a - b)
console.log(`${numbers[0]} ${numbers[N-1]}`)
Array 객체의 sort 메소드는 배열을 오름차순 정렬하여 정렬한 배열을 반환한다.
이때 sort 메소드는 배열의 요소들을 문자열로 변환한 후 요소들의 유니 코드를 기준으로 오름차순 정렬하기 때문에
문자열을 사전식으로 정렬하거나 숫자를 정렬하기 위해선 인수로 compareFunction을 전달해주어야 한다.
compareFunction의 반환값이 음수이면 앞 요소, 뒤 요소 순서로 정렬하고
compareFunction의 반환값이 양수이면 뒤 요소, 앞 요소 순서로 정렬한다.
예를 들어
numbers.sort((a, b) => a - b)
위의 compareFunction은 (a, b) => a - b로, a - b가 음수, 즉 a < b이면 a, b 순서로 정렬하므로 오름차순 정렬이 되고
numbers.sort((a, b) => b - a)
위의 compareFunction은 (a, b) => b - a로, b - a가 음수, 즉 b < a이면 a, b 순서로 정렬하므로 내림차순 정렬이 된다.
위 코드의 경우 numbers.sort((a, b) => a - b)로 오름차순 정렬 후 최솟값은 numbers[0], 최댓값은 numbers[N-1] 출력하였다.
💫 이 문제를 통해 배운 것
주어진 숫자들의 최대, 최소를 구하는 대표적인 방법으로는 다음이 있다.
• min을 주어진 범위의 최댓값으로, max를 주어진 범위의 최솟값으로 설정
• Math 객체의 min, max 메소드
• Array 객체의 sort 메소드
이때 Array 객체의 sort 메소드는 그냥 사용할 경우 우리의 상식과 다른 정렬 결과를 반환하므로 compareFunction을 인수로 전달해주어야 한다.