머쓱이보다 키 큰 사람

무과장·2023년 5월 18일
1

codingTest

목록 보기
3/8

내가 아는 정말 기본적인 문법(if문, for문)으로는 한계를 느껴 인터넷 검색 찬스를 썼다.
.filter라는 메서드를 공부하고 나서 아래처럼 작성해보았다.
filter()메서드가 궁금하다면? 클릭

function solution(array, height) {
    return array.filter((v)=>{
        v > height;
        return array.length;
    });
}


오마이갓 원본 배열들만 나온다. 조건을 잘못 적었나?
오케이 arrow function으로 써보려고 했지만 아직 미숙한가보다. if문으로 써볼까?

.filter안에 if문을 사용할 수는 없는가보다.

몇 시간을 끙끙댔지만 내가 가진 지식으로는 해결할 수 없어 보인다.
구글링 가자.

오! 다양한 방법이 존재한다.

방법1

function solution(array, height) {
    let count = 0
    for (i of array){
        if(i > height){
            count = count +1
        }
    }
    return count;
}

처음 보는 for...of라는 게 등장했다!
이건 뭘까?

for...of 명령문:

반복가능한 객체(Array, Map, Set, String, TypedArray, arguments 객체 등을 포함)에 대해서 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자의 정의 반복 후크를 호출하는 루프를 생성한다.

어떻게 사용하는가?

for (variable of iterable{
statement
}

variable: 각 반복에 서로 다른 속성값이 variable에 할당된다. 새로 만드는 변수라 이름은 아무거나 입력 가능하다.
iterable: 반복되는 열거가능(enumerable)한 속성이 있는 객체
iterable:반복 가능한

이런 문법이구나!

for...of문을 알아보았으니 위의 코드를 해석해보자

(처음보는 코드는 말로 풀어보면 이해하는데 도움이 되더라)
우선 count를 선언한다.
그 다음 array 갯수만큼 반복문을 돌려 요소 i를 출력한다.
근데 만약 height가 요소 i보다 크다면
count = count +1을 실행시키고
count를 return해라.

근데1, array들을 다루다가 왜 갑자기 배열이 아니라 숫자만 덜렁 나오지?라는 의문이 들었다.
그에 대한 답은 : 'count는 배열이 아니니까' 이다.

근데2, 왜 반복문을 돌리는거지? 배열 중에서 머쓱이보다 큰 친구들의 수만 알고 싶은건데?
답은 : 봐봐 2번째 줄에서 array에 있는 요소를 꺼내고 3번째 줄에서 그 요소를 머쓱이 height랑 비교해. 머쓱이보다 크면 그 큰 애가 하나 있구나 라고 나오지? 근데 count의 초기값이 0이니까 count+1이 동작해. 그렇게 더해져서 한 명 우선 오케이, 그 다음 위에꺼 반복해서 또 1 더해주고... 그런 과정이야! 아하 오케이 got it!

방법2

function solution(array, height) {
    return array.filter(v => v > height).length;
}

아직 arrow function이 익숙치 않아 filter뒤의 괄호를 풀어봤다.
function(v){
return v > height;
}

그 다음
내꺼랑 비교해보자. 무엇이 잘못 되었던 것일까?

우선 return 안에 또 return이 들어가 있었다는 점.
그러면 이렇게 한다면?

function solution(array, height) {
     var answer = 
         array.filter((v)=>{
        v > height;
        return array.length;
    });
    return answer;
}

처음과 똑같이 배열을 반환한다.

왜일까? 생각해보았다.
위처럼 return array.length를 해버리면 filter한 배열의 length가 아니라 그냥 array.length만 나올것이다. 하지만 그렇게 되면 숫자가 나와야하지 않나...?

function solution(array, height) {
     var answer = 
        array.filter(v => v > height).length
    
    return answer;
}

이렇게 하면 위에 했던 구조와 비슷하면서도 정답이 잘 나오게 된다.

filter 함수의 특징 :
1. 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환한다.
2. 함수가 return을 할 때 true 아님 false가 들어가는데 true일 경우에는 남겨두고 false일 경우에는 제외를 시키게 된다.

즉, 위 코드를 말로 풀어보면
주어진 함수의 테스트 = v > height;
v가 height보다 클 때 '참'으로 테스트를 통과하는 것이므로 통화한 요소들을 모아서 새로운 배열로 반환해준다. array.filter(v => v > height) 그게 여기까지의 이야기.
새로운 배열이 생기면 .length해서 그 길이를 뽑아내준다.

profile
느리더라도 꾸준히 확실하게.

0개의 댓글