[JavaScript] 배열 만들기 2 _ filter()

Yeojin·2024년 2월 23일

코딩테스트 연습 > 코딩 기초 트레이닝

✅ 문제 설명

정수 lr이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.


✅ 제한사항

  • 1 ≤ n ≤ 1,000,000

✅ 입출력 예

l r result
5 555 [5, 50, 55, 500, 505, 550, 555]
10 20 [-1]

✅ 풀이


// 나의 풀이
const solution = (l, r) => {
    
    const arr = []
    
    for(i = l; i <= r; i++) {
        let length = i.toString().length;
        let resultNum = 0;
        
        for(j = 0; j <= length; j++) {
            let splitNum = i.toString().substr(j, 1);
            
            if(splitNum === '0' || splitNum === '5') {
                resultNum++;
            } else {
                break;
            }
        }

        if(resultNum == length)
            arr.push(i);
    }
    
    return arr.length > 0 ? arr : [-1];
    
}

1. Array.from 메서드 사용

첫 번째 인자로 길이값을 받고, 두 번째 인자는 (element, index)를 받는 함수를 통해 기본값으로 0부터 길이가 5인 인덱스를 출력시킬 수도 있다.

// 다른 사람의 풀이 참고 1

function solution(l, r) {
    const result = Array.from({length:r-l+1}, (_,i) => i+l)
    			  .filter(n => !/[^05]/.test(n));
  
    return result.length ? result : [-1];
}

Array.prototype.filter ( callbackfn [ , thisArg ] )

  • filter()함수는 배열의 요소를 순회하면서 콜백 함수를 사용하여 원하는 조건에 따라 필터링하는 함수이다. 주로 특정 조건을 만족하는 새로운 배열을 필요로 할 때 사용하는 편이다. SQL로 치면 where절에서 하는 역할을 수행한다.
  • ECMA에서는 "주어진 배열의 값들을 오름차순으로 접근해 callbackfn을 통해 true를 반환하는 요소를 기준으로 신규 배열을 만들어 반환한다" 라고 정의되어 있다.
  • filter()함수는 boolean만 반환할 수 있는데, true일 경우 해당 요소를 새로운 배열에 추가하고, false일 경우 추가하지 않는다. filter 메서드는 특정 조건에 일치하는 요소만 배열에 담고 싶을 때 사용한다.
const numbers = [1, 2, 3, 4, 5];
const result = numbers.filter(number => number > 3);

console.log(numbers);
// [1, 2, 3, 4, 5];

console.log(result);
// [4, 5]

ES6) map, filter, reduce 메서드 사용법
Javascript - Array filter 사용법


2. for문 사용

// 다른 사람의 풀이 참고 2
// 0또는 5가 포함되는 문자를 공백으로 치환
// 공백 조건을 만족한다면 0과 5로만 이루어진 정수이므로
// 이를 arr 배열에 추가하여 return
function solution(l, r, arr = []) {
    for(let i = l; i <= r; i++) {
        if (i.toString().replaceAll(/[05]/g, '') === '') arr.push(i);
    }
    return arr.length ? arr : [-1];
}

정규표현식 관련

  • g : Global: 모든 문자 검색(안 쓰면 매칭되는 첫 문자만 검색)
  • i : Ignore Case: 대소문자 구분 안함
  • m : Multi line: 여러 행의 문자열에 대해 검색
  • [] : 괄호안의 문자들 중 하나
  • [^문자] : 괄호안의 문자를 제외한 것
  • ^문자열 : 특정 문자열로 시작(괄호없음)
  • 문자열$ : 특정 문자열로 끝남

정규표현식을 사용한 replace, replaceAll 치환 방법



profile
"Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better."

0개의 댓글