アルゴリズム問題は「宝探しマインド」で楽しむ！

# はじめに
「アルゴリズム問題を解く理由ってなんですか？」

<br>

私の周りでは「プログラミング勉強」特に「コーディング試験対策」という方が多いです。

<br>

では私自身はというと、「役に立つ」とは違うモチベーション・マインドかなと思います。

言うならば<font color="Orange">**「宝探しマインド」**</font>です。

| 未知の問題へ出港！！ |
|:-:|
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/ca6be7a7-09d0-afa0-1169-2cbc0251f2f4.png">  |

:::note
<details><summary>アルゴリズム問題ってこんなもの</summary>

[問題：「数値を与えるので、奇数か偶数かを返してね」](https://www.codewars.com/kata/53da3dbb4a5168369a0000fe/javascript)


```js
// 解答（一例）

function evenOrOdd(number) {
  return number % 2 === 0 ? 'Even' : 'Odd';
}
```

</details>
:::

# 【アルゴリズム問題】がもたらしてくれるもの
アルゴリズム問題をやると…


| なんだかすごそうな解答を発見！ |
|:-:|
| ![スクリーンショット 2024-11-09 8.09.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/28d84dcc-3083-4218-03fe-7f58debdb931.png)|
| ※実際の解答です。詳しくは[こちら](https://zenn.dev/haneru/scraps/157a3bed75963c) |

| 「これ、すごくないですか！？」（交流のきっかけ） |
|:-:|
| <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg02mxLBj-gWCFkDDFQgvb9f8CTz4d7QMRl1z0BEjV7wehu0wdFF-MNG_URt4eHd1wNPsiklKyrvnRy0fk6jsjFCJAgINjVzmHIFeh4eSYG3plgYUYMM-_3Y_sKv_zrh-gxG_8nqY8yFc4Y/s800/talk9_brown_man.png" width="80%"> |

| これはぜひ紹介したい！（記事を書くきっかけ） |
|:-:|
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/a3a7c4fe-ecd0-9791-cbbb-8a1284ad3404.png" width=200%> |

| "アルゴリズムできて発信もできる人" |
|:-:|
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/cc79fef7-d4c5-888d-a44c-3f69211f8860.png) |

---

つまり…

### ◆ 「自分だけの発見」があります
自分の行動が産んだ、<font color="orange">**自分だけの「発見」**</font>です。

### ◇ 技術ネタになります
「発見」はすなわち「技術ネタ」になります。

### ◆ 誰かと共有したくなり、交流が生まれます
思わず話したくなる問題・解答がそこら中にあります。

「この解答すごい！」だけでなく

「なんでこれが動くんだろう？」「わからない！」もあるでしょう。

### ◇ エンジニアとの「雑談のネタ」になります
雑談ネタがあれば、交流会も怖くないかも。

### ◆ 技術記事を書く「きっかけ」になるかもしれません
「書くネタがない」はよく聞きますが、

**「問題・何が難しいか・すごいと思った解答・なぜすごいか」**

これだけで記事になります。

### ◇ 記事を書き、技術雑談すると、うっすら「できる人」に見えます
ITエンジニア界隈の多くは、アウトプットできるだけで「すごい」と言ってくれます。

アウトプットすることで、相手があなたに話しかけるきっかけにもなります。



---
もちろんこれだけではありません。


:::note
### 問題を解けた達成感
きれいに書けたときの「**自分、天才では！？**」と感じる瞬間が最高です。
:::

:::note
### コードが洗練される
アルゴリズム問題・そして他人の解答を見ることで、「こんなスマートに書けるんだ！」という発見があります。

私のコードを洗練させたのは、例えば以下との出会いです。
- 関数型プログラミングとの出会い ➪ Haskellへの挑戦と学び
- 再帰という書き方
- `for`ではなく`map`を使う
#### 昔と今の比較

実際に、過去と現在を比較してみましょう。

[昔解いた問題](https://www.codewars.com/kata/558fc85d8fd1938afb000014/javascript)に再挑戦してみました。

---
#### 昔の解答
```js
function sumTwoSmallestNumbers(numbers) {  
  const numbersMin = function(a, b) {return Math.min(a, b);}
  let Min1 = numbers.reduce(numbersMin);
  let i = numbers.indexOf(Min1);
  numbers.splice(i,1);
  let Min2 = numbers.reduce(numbersMin);
  return Min1 + Min2;
}
```
**長い・無駄が多い・処理が追いにくい・共通化しきれてない**
パッと見てウッとなるコードです。

---
#### 今の解答①（可読性重視）
```js
function sumTwoSmallestNumbers(numbers) {  
  const sorted = numbers.sort((a, b) => a - b)
  return sorted[0] + sorted[1]
}
```
**超シンプル**で、何をやっているのか**一目瞭然**です。

---
#### 今の解答②（1つのメソッドチェーンで記述）
```js
const sumTwoSmallestNumbers = numbers => 
numbers.sort((a, b) => a - b).slice(0, 2).reduce((a, b) => a + b);
```

こちらは個人的に「美しい」と思えるコードです。
Qiitaだと見にくいので2行にしてますが、本来1行のコードです。
:::

:::note
### 就活成功の一因
<details><summary>私的な話になりますが・・・</summary>

私が今の会社に入れたのは「毎日技術記事を書き続けてきた継続力」が一因です。

毎日書くなかで、記事ネタが枯渇することもありました。

そんな時、支えになったのが「アルゴリズム問題」でした。
問題の紹介、問題を解く中での自分の思考、そして解いたからこそわかる他人の回答の凄さ。

困った時にはアルゴリズム問題をネタにして、一日も休まず記事を投稿し続けることができました。


</details>
:::

# 【アルゴリズム問題】を最大限楽しむために

ここまで読んでいただいた方に、**改めて伝えたい**こと。

それは、「**他人の回答から学ぶ**」ことの価値です。

私にとって、**「アルゴリズム問題を解くこと」と「他人の回答から学ぶこと」はセット**です。

自分が解くだけでは、「<font color="orange">**自分だけの発見＝宝物**</font>」は見つかりません。

---

ということで「**[CodeWars](https://www.codewars.com/dashboard)**」というサイトがオススメです！！

| 他人の解答が見られる！ |
|:-:|
|  ![スクリーンショット 2024-11-09 11.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/d348f9ae-219f-ece3-c744-2556b0ce3aff.png) |

:::note
「他人の解答から学ぶ」にはベストなサイトです。

#### ◆ ユーザー同士の投票機能
➪ **「評価の高い解答」にフォーカスして学ぶ**ことができます！

#### ◇ 「Best Practice（実用的）」と「Clever（天才）」の2つの評価
「**Best Practice**」からは「基礎的なテクニック」

「**Clever**」からは「美しさ」「遊び心」そして<font color="orange">「**思わず話したくなる発見**」</font>

ーーを得ることができます。
:::


#### 「CodeWarsの始め方」はこちら
少し読みにくいですが、丁寧に書かれている記事です。

https://qiita.com/javacommons/items/7c473cda7825ab99e08c


#### 「オススメな理由」をもっと知りたい方はこちら
他のアルゴリズム学習サイトと比較して、オススメな理由を紹介しています。

https://qiita.com/kohki_takatama/items/2ae2808b931e943262b8


---

# おわりに

簡素な内容ですが、「このメソッドを覚えておけば間違いないよ」を書きました。

https://zenn.dev/haneru/scraps/0a616048d190ee

アルゴリズム問題を楽しむ一助になれば幸いです。

お読みいただき、ありがとうございました。