딱 봤을땐, 쉽게 풀릴 것이라 믿었었는데, 의외로 시간을 많이 잡아먹었다...
배열이 정렬이 안되어있을 것이라 생각도 못하고, 다른 문제 때문인가 싶어서 하루종일 괴로워했다는...
진짜 마법같이 sort를 쓰자마자 한방에 해결될 줄이야..... 😥😥😥😥 백준 싫어요오........
입력 값 다 풀어줘요.............
const input = require('fs').readFileSync('dev/stdin').toString().split('\n')
const numbers = input[1].split(' ').sort((a,b)=>a-b)
const firstnum = Number(numbers[0])
const lastnum = Number(numbers[numbers.length-1])
let result = 0
numbers.length>=2?result = firstnum*lastnum:result = firstnum*firstnum
console.log(result)
다른 분들을 보니 나처럼 배열 양 끝을 구하기 보다는 배열 전체에서 max와 min으로 구한 것 같다.
조금 의아한 점이 있다면, 나라면 Math.max(...arr) 식으로 큰 값을 구했을 것 같은데,
Math.max.apply(null,arr)을 사용했다는 것이다.
apply에 대한 내용은 mdn을 찾아보자!
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
참고자료
https://velog.io/@devmin/TIL-%ED%95%A8%EC%88%98-%EB%A9%94%EC%86%8C%EB%93%9C-5ok29tthyz
https://www.youtube.com/watch?v=KfuyXQLFNW4
https://velog.io/@yhe228/%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98%EC%97%90%EC%84%9C-this
apply 를 보다 효과적으로 이용하면 일부 내장 함수는 어떤 작업에 대해서는 배열과 루프없이 쉽게 처리된다고 한다.
apply(null, arr) 식을 사용하면, arr 안에 있는 인자 하나하나를 가져와서 쓰는 for문과 유사하게 처리된다.
그렇다면 스프레드연산자와 apply의 데이터 처리의 효율성을 알아보자!
//apply를 사용할 경우
const input = require('fs').readFileSync('dev/stdin').toString().split('\n')
const numbers = input[1].split(' ').sort((a,b)=>a-b)
const maxnum = Math.max.apply(null,numbers)
const minnum = Math.min.apply(null,numbers)
let result = 0
numbers.length>=2?result = maxnum*minnum:result = minnum*minnum
console.log(result)
//136ms
//스프레드 연산자를 사용할 경우
const input = require('fs').readFileSync('dev/stdin').toString().split('\n')
const numbers = input[1].split(' ').sort((a,b)=>a-b)
const maxnum = Math.max(...numbers)
const minnum = Math.min(...numbers)
let result = 0
numbers.length>=2?result = maxnum*minnum:result = minnum*minnum
console.log(result)
//132ms
둘다 큰 차이가 없어보인다. 하지만 앞으로 apply는 DOM을 조작할 때 유용하게 쓰인다는 것을 알았다.
이전에 HTTP Collection을 사용할 때는 Array.from()으로 배열로 바꿔주었어야 했는데 이제는 apply를 쓰면 되겠다! :-)