【基本情報技術者試験 新制度 科目B】偵察がてら受けて来た (サンプル問題アルゴリズムPythonコード付き)

## 初めに
基本情報技術者試験の制度が今年度から変わりました。
前回旧制度で午後50点で落ちてしまったので、専門学校を在学中には合格したいと思い試験を受けに行きました。どんな問題がでるのか把握しないと対策のしようがないのでサンプル問題を一時間程で一通り勉強しただけですが、普段からプログラミングの勉強をしているので、偵察がてら試験を受けに行きました。
合否の正式な結果発表は月末ぐらいなのですが、CBT方式なので点数は終わった後すぐに分かるようになってました。

点数は1000点満点に代わっていて**750点**でした！
全く勉強してないのにラッキー！偵察がてら受けに行ったら受かっちゃったぜひゃっほーうぇーい

は？なにこいつうっざ〇ねやと思って記事を閉じようとしているそこのあなた！
**ごめんなさい笑 m(_ _)m**
もう少し話を聞いていってください。
肝心な、問題と対策方法を話して行きます。

## 対策方法
一番知りたいであろう対策方法と問題内容を**規約の範囲内**で話していきたいと思います。正直難易度については旧制度程ではないですがそこまで簡単ではなかったです。ちゃんとそれなりに難しかったです。

問題の構成は以下のようになっています。
* **アルゴリズム16問**
* **セキュリティ4問**

セキュリティは問題数も少なければ、読めば分かる問題もあるのでアルゴリズムの対策を念入りにやりましょう。午前の知識は抑えておくとよいと思います。全くやらなくてもいいって意味ではないです。

問題に関しては、公開されている新制度のサンプル問題をとにかくやりましょう。
全体を通してどれとは言えませんがけっこうサンプル問題と同じような問題が出題されていました。

基本情報と言えばおなじみのサイトである基本情報技術者試験ドットコム通称過去問道場がおすすめです。
[基本情報技術者試験ドットコム](https://www.fe-siken.com/kakomon/sample/)

あとは、サンプル問題にもあるソートや探索木や再帰呼び出しのアルゴリズムのように、
* 配列
* ソート
* サーチ
* 木構造
* ハッシュ法

などアルゴリズムの各項目の知識を抑えておくとよいと思います。

## アルゴリズムの勉強方法
**そもそもアルゴリズムの勉強方法なんてわかんねーよって方へ**
アルゴリズムの勉強方法自体難しいと思うので普通のことです。
大事なことは、参考書とか買うよりもぶっちゃけこれです。
* **コードの処理を読み解く力**
* **自分でプログラムの流れを考える力**
* **自分の得意な言語に置き換える**

の3つの力をつけることです。
普段からPythonやJavaなど各言語のプログラミングをしている方はすんなり入れたりもすると思います。
[Atcoder](https://atcoder.jp/home)や[paiza](https://paiza.jp/)や[TechFUL](https://techful-programming.com/)など競技プログラミングに取り組むのがおすすめです。

コードの読み書きに慣れてきたらあとはひたすら問題を解いていくだけです。サンプル問題を何週も解くとよいと思います。

そんなに時間かけたくなーいって方はんー参考書を買って頑張ってくださいとしか言いようがないです。

## Pythonでサンプル問題を実装
もう試験受けた後ですが、Pythonでアルゴリズム問題を実装してみました笑
よかったら問題と合わせて勉強に使ってください。
完全に実装できてないものもありますが、流れは分かると思います。
穴埋めを既に埋めているので一度解いてからの参照を勧めます。
リンク先からコードを確認できます。
[GitHubリポジトリ/FE_B_sample](https://github.com/ishizukuma/FE_B_sample)

こんな感じの上げています。
問3
```Python:Q03.py
def makeNewArray(in_list):
    out = []
    out.append(in_list[0])
    
    for i in range(1, len(in_list)):
        tail = out[len(out)-1]
        out.append(tail + in_list[i])
    
    return out

result = makeNewArray([3,2,1,6,5,4])
print(result, "\nanswer = ",result[4])
```
問8
```Python:Q08.py
def prioSched():
    class PrioQueue:
        def __init__(self):
            self.queue = []
        
        def enqueue(self, item, priority):
            self.queue.append((item, priority))
            self.queue.sort(key=lambda x: x[1])
        
        def dequeue(self):
            if len(self.queue) == 0:
                return None
            return self.queue.pop(0)[0]
        
        def size(self):
            return len(self.queue)

    prioQueue = PrioQueue()
    prioQueue.enqueue("A", 1)
    prioQueue.enqueue("B", 2)
    prioQueue.enqueue("C", 2)
    prioQueue.enqueue("D", 3)
    prioQueue.dequeue()
    prioQueue.dequeue()
    prioQueue.enqueue("D", 3)
    prioQueue.enqueue("B", 2)
    prioQueue.dequeue()
    prioQueue.dequeue()
    prioQueue.enqueue("C", 2)
    prioQueue.enqueue("A", 1)
    while prioQueue.size() != 0:
        print(prioQueue.dequeue())

prioSched()
# 出力結果：A　C　D　D
```
問14
```Python:Q14.py
def findRank(sortedData, p):
    i = round(p * (len(sortedData) - 2))
    return sortedData[i+1] if p != 0 else sortedData[i]

def summarize(sortedData):
    rankData = []
    p = [0, 0.25, 0.5, 0.75, 1]
    
    for i in range(len(p)):
        rankData.append(findRank(sortedData, p[i]))
    
    return rankData

print(summarize([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]))
```

## 最後に
私自身普段から競技プログラミングに取り組んでいるので、すんなりと合格することができました。
しっかりと対策をすれば、**絶対受かる❕**とまでは言いませんがなんとかなると思います。

**ありがとうございました❕**