코드
두 가지 방법을 찾아서 풀이해보았는데, 둘 다 Math.max()와 Math.min()를 사용한다는 점은 동일하지만 나머지 부분이 조금 다르다.
1)
function solution(s) {
var answer = "";
const arr = s.split(" ").map((num) => +num);
const max_num = Math.max(...arr);
const min_num = Math.min(...arr);
answer = [min_num, max_num].join(" ");
return answer;
}
Math.max() 정적 메서드는 매개변수로 주어진 숫자 중 가장 큰 수를 반환하거나, 매개변수가 없을 경우 -Infinity를 반환합니다.
출처 : Math.max() - Javascript | MDN
max와 min의 매개 변수의 수는 따로 언급이 없는 것으로 보아 제한이 없는 것 같다. 그렇지만 자바스크립트의 max와 min은 매개 변수로 배열을 넣을 수 없기 때문에 이 배열을 풀어주는 연산이 필요하다.
`...`은 spread operator로 쉽게 말하자면 괄호([])를 없애주는 연산자라고 보면 된다. 이것을 사용해서 괄호를 풀어줌으로써 max()와 min()이 기대하는 매개 변수 형태로 넣어주었다.
2)
function solution(s) {
var answer = "";
const arr = s.split(" ").map((num) => +num);
const max_num = arr.reduce((a, b) => Math.max(a, b), -Infinity);
const min_num = arr.reduce((a, b) => Math.min(a, b), Infinity);
answer = [min_num, max_num].join(" ");
return answer;
}
위에서는 배열 arr를 spread operator을 이용해서 풀어줬지만, 이번에는 reduce를 사용해서 요소 하나하나 살펴보고 최댓값과 최솟값을 구했다.
reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.
출처 : Array.prototype.reduce() - JavaScript | MDN
arr.reduce(callback[, initialValue])
reduce() 함수는 이와 같은 형태를 갖고 있는데, 여기의 callback 부분이 바로 reducer 함수이다.
reducer 함수는 아래의 4개의 인자를 갖는다. 이 중 3, 4번은 optional이라 생략해도 무방하다.
1. 누산기 (acc) : callback의 반환값을 누적한다.
2. 현재 값 (cur) : 처리할 현재 요소.
3. 현재 인덱스 (idx) : 처리할 현재 요소의 인덱스. initialValue를 제공한 경우 0, 아니면 1부터 시작.
4. 원본 배열 (src) : reduce()를 호출한 배열.
그리고 이외에도 reduce()의 매개 변수로는 initialValue가 있는데, 이는 callback의 최초 호출에서 첫 번째 인수에 제공하는 값으로, 초기값을 제공하지 않으면 배열의 첫 요소를 사용하게 된다. 만약 빈 배열에서 초기값 없이 reduce()를 호출하면 오류가 발생한다.
reduce()의 반환 값은 누적 계산의 결과 값으로, 최종적으로 acc에 남는 값이라고 생각하면 된다.
const max_num = arr.reduce((a, b) => Math.max(a, b), -Infinity);
이 코드의 reduce() 함수에서 a는 누산기, b는 현재 값이다. a의 초기값은 -Infinity로 두고, 배열의 요소를 하나씩 a에 저장된 값과 비교하며 a에는 그 둘 중 큰 수를 저장하는 것이다. 그렇기 때문에 배열의 모든 요소에 대해 reducer 함수를 실행하면 a에는 결국 배열의 최댓값이 남게 되어 이것을 리턴한다.
reduce는 거의 사용해보지 않아서 잘 몰랐는데, 이 문제를 풀면서 사용법에 대해 공부할 수 있었다.
이걸 제출하고 난 뒤에 다른 사람들의 코드를 보니 배열을 정렬하여 가장 왼쪽 값과 오른쪽 값을 뽑아낸 사람도 있었고, 나와 비슷하게 풀었지만, method chaining을 이용하여 더 짧고 간결하게 풀이한 사람도 있었다.
❔더 공부해야 할 것
1. Method chaining
2. 문자열 처리
'문제풀이 > 구현' 카테고리의 다른 글
[Javascript/자바스크립트 ] (프로그래머스) [1차] 뉴스 클러스터링 (0) | 2024.12.21 |
---|---|
[Python/파이썬] 백준 16960번 스위치와 램프 (0) | 2024.10.31 |
[Python/파이썬] 백준 2628번 종이자르기 (0) | 2024.05.13 |
[Python/파이썬] 백준 20665번 독서실 거리두기 (0) | 2024.05.10 |
[Python/파이썬] 백준 2933번 미네랄 (0) | 2024.04.23 |