프로그래머스 Lv.1 로또의 최고 순위와 최저 순위, Array.filter 사용하기, Array.includes() v.s. Set.has()

이은지·2022년 6월 2일
0

코딩 테스트

목록 보기
3/10
post-thumbnail

✅ Array.filter()

배열에서 특정 조건을 만족하는 요소의 개수를 세야 할 때
: Array.filter 사용하기

Array.filter(callbackFunc)
콜백함수가 true를 리턴하면 해당 요소를 새로운 배열에 추가한다.
결과적으로 콜백함수에 명시한 조건을 충족한 요소들을 담은 새로운 배열이 생성된다.

따라서 콜백함수는 true를 return해줘야 한다.
화살표 함수에서 바로 값을 리턴하고 싶은 경우 중괄호 없이 리턴 값을 적어주면 된다.
중괄호를 사용할거면 중괄호 내에서 return 키워드를 써줘야 한다.

map함수가 익숙하다보니 map함수로 모든 원소를 순회하며 콜백함수 내에서 if-else 조건절을 사용하는 패턴을 자꾸 쓰는데 filter와 reduce를 함께 사용하는 버릇을 들여야겠다.

✅ Array.includes() v.s. Set.has()

Array.includes()를 사용하려다가 문득 시간복잡도를 궁금해 찾아봤더니 O(n)이 소요된다고 한다.
반면 유사한 기능인 Set.has()는 O(1)이 소요된다.
따라서 만약 중복값이 없는 배열에서 특정 요소를 찾는 연산을 여러 번 반복해야 한다면 배열을 Set으로 바꿔도 좋을 것 같당.

다만 배열을 Set으로 만드는데 O(n)이 소요된다는 맹점은 존재한다.
그래도 매번 O(n)이 걸리는 것보단 나으니까!

+) 삼항연산자 사용 시에
"변수 선언 → 삼항연산자로 변수에 값 할당" 이 패턴을 사용하느라 쓸데없는 변수 선언이 많다.
한 번 쓰고 말 변수라면 변수를 선언하는 대신 아래 코드 처럼 조건에 따라 다른 연산을 하는 패턴을 익히면 좋겠다.

🐸 정답 코드

function solution(lottos, win_nums) {
    const wn = new Set(win_nums);
    
    const min = lottos.filter((v) => wn.has(v)).length;
    const max = lottos.filter((v) => !v).length+ min;
    
    var answer = [];
    max>0 ? answer.push(7-max) : answer.push(6);
    min>=2 ? answer.push(7-min) : answer.push(6);    
    return answer;
}
profile
교육학과 출신 서타터업 프론트 개발자 👩🏻‍🏫

0개의 댓글