B問題の傾向と対策

はじめに

前回の記事の続きです。
今回は、ABCのB問題について、分類・考察していきます。

B問題の分類

対象はABC126~ABC178(現在の6問形式で開催されるABC)です。問題の解き方のネタバレが載っているので、閲覧注意でお願いします。

1重for文による全探索

B - Algae:順に計算し出力
B - Uneven Numbers:数え上げ
B - FizzBuzz Sum:条件を満たす値の和

配列(数列)の扱いと全探索

B - Bounding:数え上げ
B - Ordinary Number:数え上げ
B - Buffet:複雑な処理の実装
B - Roller Coaster:数え上げ
B - Common Raccoon vs Monster:配列の要素の和
B - Papers, Please:Yes/No判定
B - Homework:配列の要素の和
B - Judge Status Summary:文字列からなる配列、数え上げ
B - Distance:幾何、数え上げ

配列に対するより複雑な考察

B - 0 or 1 Swap:条件の置き換え、Yes/No判定
B - Achieve the Goal:平均値
B - Popular Vote:和の計算、数え上げによるYes/No判定

文字列の扱いと全探索

B - YYMM or MMYY:判定
B - Tap Dance:YesNo判定
B - Echo:YesNo判定
B - ROT N:文字列の置換、文字コード
B - Palindrome-philia:数え上げ
B - Strings with the Same Length
B - Count ABC:数え上げ
B - I miss you...:文字列の置換
B - String Palindrome:回文判定
B - ... (Triple Dots)
B - Minor Change:数え上げ
B - Multiple of 9:整数を文字列として受け取る

2重for文、全探索

B - Balance:最小値
B - Bite Eating:和の計算と最小値
B - Good Distance:幾何、数え上げ
B - TAKOYAKI FESTIVAL 2019:和の計算
B - 81:全探索によるYes/No判定
B - Trick or Treat:数え上げ
B - Substring:文字列、数え上げたものの最小値

3重for文による全探索

B - Making Triangle:数え上げ

ソート

B - Guidebook:pair型のソート
B - Mix Juice

数学的な問題

B - Golden Apple:状態の考察
B - One Clue:状態の考察
B - Power Socket
B - Greedy Takahashi:シミュレーション
B - Comparing Strings
B - Count Balls:大きな数に驚かない。余りによる場合分け。
B - Golden Coins:最適化の考察
B - Battle:シミュレーション、場合分け
B - Easy Linear Programming:場合分け
B - Crane and Turtle:全探索でも解ける
B - Product Max:最大値

その他

B - Resistors in Parallel:小数型の扱い
B - Digits:整数の桁の和
B - Bingo:複雑な実装の処理
B - Multiplication 2:コーナーケースの場合分け、オーバーフロー
B - 1%:小数型の扱い、while文

考察

前回の記事でも述べましたが、C++Pythonでは大きく言語仕様がことなるので、勉強方法も当然変わってくると思います。
このブログではC++での学習を仮定しています。

B問題では、A問題とは異なり、for文配列を用いた問題が出題されます。
これらを用いることで、プログラミングの幅が一気に広がります。
いきなりB問題を解くのは難しいので、A問題のうち、以下のような問題をfor文や配列で解くのがよい練習になると思います。

おすすめの問題
A - We Love Golf:for文
A - Five Variables:配列
A - Lucky 7:文字列に対するfor文
A - Security:文字列に対するfor文

for文や配列を用いる問題についても、難易度にはかなりバリエーションがあります。
条件をみたすものの数を数える配列の合計値を求めるといったシンプルな処理を指示通りに書けばよい問題から、じっくりと考察して正しい解き方を自分で考えないといけない問題まで、それぞれです。

つづいて文字列ですが、こちらもA問題以上の知識や実装力が要求されます。
具体的には、

  • 文字列の長さの取得方法
  • 部分文字列の取得方法
  • 文字列上でのfor文の利用

などです。

ソートに関して、該当の問題が2問ありましたが、B問題の時点ではあまり必要な知識ではないと思います。ただし、決して難しくはないので覚えてしまってもよいと思います。

数学的な考察を行う問題についてですが、やはりA問題より高い水準の洞察力が要求されます。
難しい知識はあまり必要でないので、サンプルなどをもちいて実験し、法則を見つけ出すとよいでしょう。
また、数学的に解くか、for文を用いて解くかの正しい判断が必要な問題もあります。

もちろん、A問題と同様、

  • 独特の問題形式に対する慣れ
  • バグが出たときに、どこが間違えているかを見つけ修正する能力
  • どうやって実装するか忘れたときに、インターネットの海から正しい情報を見つける能力

をさらに高めていく必要があります。
とくに、B問題では入力の与えられ方がA問題よりも複雑になっています。

B問題まで安定して解ければ、わたしはプログラミングができると自信をもって言えるレベルに達しています。
茶色コーダーまではもうすこしステップアップが必要です!