[JS/프로그래머스] 수열과 구간 쿼리 2 리팩토링

jiyoon·2025년 7월 25일


🤔 기존 작성 코드

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]);	
            }		// arr2: s ≤ i ≤ e인 모든 i에 대한 arr[i]		
        for (let j of arr2) {
            if (j > k) {
                arr3.push(j);
                arr3.sort((a, b) => a - b);
            }
        }		// arr3: k보다 큰 arr[i] -> 오름차순 정렬
        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		// 원본 arr을 가공한 새 배열 filtered
            .slice(s, e + 1)         // s부터 e까지 자름
            .filter(num => num > k) // 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 생략 가능
  • filtersort 체이닝으로 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); // 👉 3
Math.min(-5, 0, 7); // 👉 -5
  • Math.min()은 배열을 직접 받지 않기 때문에 전개 연산자(spread syntax) 를 함께 써줘야 함
const arr = [5, 2, 9];
const min = Math.min(...arr); // 👉 2

Math.min(5, 2, 9)
  • 여기서 ...arr은 배열을 풀어서 각각의 숫자처럼 넘겨주는 역할

3. 삼항 연산자로 조건 분기 간결화

return filtered.length > 0 ? filtered[0] : -1;
  • map()을 이용해 새로운 배열에 넣고 싶은 요소를 return해야 함 → `filtered[0]

0개의 댓글