

🤔 기존 작성 코드
function solution(arr, queries) {
let result = [];
for (let [s, e, k] of queries) {
let arr2 = [];
let arr3 = [];
for (let i = s; i <= e; i++) {
arr2.push(arr[i]);
}
for (let j of arr2) {
if (j > k) {
arr3.push(j);
arr3.sort((a, b) => a - b);
}
}
if (arr3.length == 0) {
result.push(-1);
} else {
result.push(arr3[0]);
}
}
return result;
}
🧠 리팩토링
function solution(arr, queries) {
return queries.map(([s, e, k]) => {
const filtered = arr
.slice(s, e + 1)
.filter(num => num > k)
.sort((a, b) => a - b);
return filtered.length > 0 ? filtered[0] : -1;
});
}
1. map을 활용해서 result 배열을 따로 선언하지 않고 바로 반환
Array.map()
- Array 인스턴스의 순회 메서드
- 호출한 배열의 모든 요소에 콜백 함수를 실행한 결과로 채운 새로운 배열을 생성
- result.push() 역할을 해줌
return queries.map(([s, e, k]) => {
});
2. 함수형 스타일 활용
- 함수형 스타일은
map, filter, reduce 같은 배열 메서드를 조합해서 상태를 바꾸지 않고 데이터를 흐름처럼 처리하는 방식
(의도를 한눈에 파악하기 쉬움)
- 배열(Array)에서 제공하는 메서드 체이닝(method chaining) 기법
→ 배열이 메서드를 연속적으로 호출
arr
.slice(s, e + 1)
.filter(num => num > k)
.sort((a, b) => a - b);
slice로 s ~ e 구간을 잘라냄 → arr2 생략 가능
filter와 sort 체이닝으로 arr3 생략 가능
⁉️ sort() 대신 Math.min() 사용하면 최솟값 하나만 빠르게 뽑을 수 있음
function solution(arr, queries) {
return queries.map(([s, e, k]) => {
const range = arr.slice(s, e + 1);
const filtered = range.filter(v => v > k);
return filtered.length ? Math.min(...filtered) : -1;
});
}
const filtered = arr
.slice(s, e + 1)
.filter(num => num > k);
return filtered.length > 0 ? Math.min(...filtered) : -1;
Math.min()은 자바스크립트 내장 객체 Math 안에 있는 정적 메서드
→ 인자로 받은 값들 중에서 가장 작은 수를 반환
Math.min(10, 3, 8);
Math.min(-5, 0, 7);
Math.min()은 배열을 직접 받지 않기 때문에 전개 연산자(spread syntax) 를 함께 써줘야 함
const arr = [5, 2, 9];
const min = Math.min(...arr);
Math.min(5, 2, 9)
- 여기서
...arr은 배열을 풀어서 각각의 숫자처럼 넘겨주는 역할
3. 삼항 연산자로 조건 분기 간결화
return filtered.length > 0 ? filtered[0] : -1;
map()을 이용해 새로운 배열에 넣고 싶은 요소를 return해야 함 → `filtered[0]