体育科出身の僕がLeetCode入門してみた - Day6 2634. Filter Elements from Array

# 概要
文系（体育科）卒業の僕が、人並みのアルゴリズムを身につけるためにLeetCodeを初めてみました。
日本だとAtCoderが一般的なようですが、海外エンジニアへの憧れを持つ僕はLeetCodeを選びました。

フロントの言語しかほぼ触ったことがないのでJavaScriptでやっていこうと思います。

# 問題
[2634. Filter Elements from Array](https://leetcode.com/problems/filter-elements-from-array/description/?envType=study-plan-v2&envId=30-days-of-javascript)

問題文
> Given an integer array arr and a filtering function fn, return a filtered array filteredArr.<br>
The fn function takes one or two arguments:<br>
> - arr[i] - number from the arr
> - i - index of arr[i]
>
> filteredArr should only contain the elements from the arr for which the expression fn(arr[i], i) evaluates to a truthy value. A truthy value is a value where Boolean(value) returns true.<br>
Please solve it without the built-in Array.filter method.



初期コード
```javascript
/**
 * @param {number[]} arr
 * @param {Function} fn
 * @return {number[]}
 */
var filter = function(arr, fn) {
    
};
```

問題を整理します。
- 整数の配列`arr`
- フィルターする関数`fn`
    - 1 or 2つの引数
        - `arr[i]`
        - `i`
- 返り値は配列のfilterdArr
    - fn(arr[i],i)をtruthy評価する要素だけを含む?

最後の方の問題文がよくわかんないですね。
例題から考えていきます。

### 例題1
>Input: arr = [0,10,20,30], fn = function greaterThan10(n) { return n > 10; }
Output: [20,30]
Explanation:
const newArray = filter(arr, fn); // [20, 30]
The function filters out values that are not greater than 10


### 例題2
> Input: arr = [1,2,3], fn = function firstIndex(n, i) { return i === 0; }
Output: [1]
Explanation:
fn can also accept the index of each element
In this case, the function removes elements not at index 0

### 例題3
> Input: arr = [-2,-1,0,1,2], fn = function plusOne(n) { return n + 1 }
Output: [-2,0,1,2]
Explanation:
Falsey values such as 0 should be filtered out

とりあえず、`filteredArr`を`return`する部分を作り、入力された`arr`をループ処理を行います。
```javascript
/**
 * @param {number[]} arr
 * @param {Function} fn
 * @return {number[]}
 */
var filter = function(arr, fn) {
    let filteredArr = [];
    for (let i = 0; i < arr.length; i++) {
        //処理が入る
    }
    return filteredArr;
};
```

fn関数からの戻り値がtruthの時だけ、filterdArrに追加してみます。

```javascript
/**
 * @param {number[]} arr
 * @param {Function} fn
 * @return {number[]}
 */
var filter = function(arr, fn) {
    let filteredArr = [];
    for (let i = 0; i < arr.length; i++) {
        if(fn(arr[i],i)) {
            filteredArr.push(arr[i]);
        }
    }
    return filteredArr;
};
```

こうすれば...
`📝例題1`
- i=0の時fn(arr[0])→greaterThan10(0)　→ false
- i=１の時fn(arr[1])→greaterThan10(10)　→ false
- i=2の時fn(arr[2])→greaterThan10(20)　→ true
- i=3の時fn(arr[3])→greaterThan10(30)　→ true

となり、`[20,30]`が返ってきます。

`📝例題2`
- i=0の時fn(arr[0],0)→firstIndex(1,0)　→ true
- i=１の時fn(arr[1],1)→firstIndex(2,1)　→ false
- i=2の時fn(arr[2],2)→firstIndex(3,2)　→ false

となり、`[1]`が返ってきます。

`📝例題3`
- i=0の時fn(-2)→plusOne(-2)　→ −１　→ true
- i=1の時fn(-1)→plusOne(-1)　→ 0　→ false
- i=2の時fn(0)→plusOne(0)　→ 1　→ true
- i=3の時fn(1)→plusOne(1)　→ 2　→ true
- i=4の時fn(2)→plusOne(2)　→ 3　→ true

となり、`[-2,0,1,2]`が返ってきます。

*JavaScriptでは0以外の数値は全てtrueと評価されます。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Boolean#%E8%AB%96%E7%90%86%E5%80%A4%E3%81%B8%E3%81%AE%E5%9E%8B%E5%BC%B7%E5%88%B6

全てのケースパスできました🥹
![CleanShot 2024-07-04 at 08.10.45@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/bea9ff74-b42e-c2bc-731f-816c6703911d.jpeg)

あまりスコアは良くなさそう。
![CleanShot 2024-07-04 at 08.11.50@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/6ba83fbf-974b-ef61-66b8-d0184551b2e7.jpeg)


普段あまりみないですが、Solutionsのところに他の人の回答だったり、回答に対して議論だったりを見ることができるので面白いです。

![CleanShot 2024-07-04 at 08.14.42@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/b07d74ca-fa8e-7e52-2034-dddced4b490b.jpeg)

:::note
インデックスはJSのマジックパワーだということを学びました✍️
:::