[백준] JavaScript 10818번 최소, 최대

Noma·2021년 8월 28일
0

Question

[백준] JavaScript 10818번 최소, 최대

input

첫째 줄에 정수의 개수N(1<=N<=1,000,000)
둘째 줄에 N개의 정수가 공백으로 구분되어 주어짐

output

정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력하라.

example

5
20 10 35 30 7

ouput: 7 35

Solution 1

array.sort() 함수 이용하여 오름차순으로 정렬하여 array[0]과 array[n-1] 출력한다.

const [n,...arr]=require('fs').readFileSync('/dev/stdin').toString().trim().split(/\s+/).map(Number);
arr.sort((a,b)=>a-b);
console.log(arr[0], arr[n-1]);

Solution 2

min, max 변수를 선언하고 for문을 돌면서 각 인덱스의 값과 비교하여 더 작은값을 min에 더 큰 값을 max에 업데이트 해준다.

const [n,...arr]=require('fs').readFileSync('/dev/stdin').toString().trim().split(/\s+/).map(Number);
let min=arr[0];
let max=arr[0];
for(let i=0;i<n;i++){
    min>arr[i]&&(min=arr[i]);
    max<arr[i]&&(max=arr[i]);
}
console.log(min,max);

Solution 3 (불가)

Math.min(), Math.max() 함수와 spread syntax(...)를 이용하여 배열 안의 min, max를 구한다.

const [n,...arr]=require('fs').readFileSync('/dev/stdin').toString().trim().split(/\s+/).map(Number);
console.log(Math.min(...arr),Math.max(...arr));

콘솔로 테스트 케이스를 만들어 확인해 보면 결과가 맞게 출력되는데, 백준에서 돌리면 런타임 에러(StackSizeExceeded)가 난다. 뭐가 문제인 걸까?🤔

(혹시 어디가 잘못된지 아시는 분 계신다면 댓글 부탁드립니다.😭)

What I learned

1. array.sort([compareFunction])

비교 함수를 전달하지 않으면 요소를 문자열로 변환하고 유니코드 포인트 순서로 문자열을 비교하여 정렬한다.

비교 함수가 있으면 그 함수의 반환 값에 따라 배열의 요소를 정렬한다.

  • compareFunction(a,b) < 0 => a, b 순으로 정렬
  • compareFunction(a,b) = 0 => 순서 변경 X
  • compareFunction(a,b) > 0 => b, a 순으로 정렬

즉 주어진 함수의 결과값이 양수면 앞뒤 순서를 바꿔준다고 생각하자.

  • 오름차순: array.sort((a,b)=>a-b)
  • 내림차순 : array.sort((a,b)=>b-a)

2. Math.min(), Math.max()

Math.min(): 주어진 숫자들 중 가장 작은 값 반환
Math.max(): 주어진 숫자들 중 가장 큰 값 반환

Spread syntax(...)를 이용하여 배열 안의 값들을 복사해와 해당 함수에 넣어주면 배열 안 숫자값들의 min과 max를 구할 수 있다.

예시

const arr=[1,4,5,6,1,73,2];
console.log(Math.max(...arr)); // 73

3. 공백으로 구분해서 출력

평소console.log(${변수1} ${변수2});처럼 출력해 왔었는데, 생각해보니console.log(변수1, 변수2);만 해도 공백으로 구분된다는 점을 놓치고 있었다.

다음부터 굳이 백틱을 안 써도 되는 것들은 콤마로 구분해서 출력해야겠다.

profile
오히려 좋아

0개의 댓글