普段はWebアプリケーション開発をメインにしているエンジニアの私ですが、久しぶりに競技プログラミングの問題に挑戦してみました。今回はPaizaの最難関Sランク問題に取り組んだ経験を共有したいと思います。
※言語は慣れているjavaにしました
苦労した点と学び
普段の業務ではWebアプリケーションの開発が中心で、アルゴリズムの実装にはかなり苦戦しました。特に二分探索のような基本的なアルゴリズムも、恥ずかしながら実務では使う機会が少なく、生成AIの助けを借りながら学習を進めました。
「より効率的な解法があるはずだ」という思いは常にありましたが、まずは自分なりのアプローチで問題を解くことを重視しました。(完璧な解法を求めるよりも、実装して動くものを作ることを優先)
工夫した点
一番工夫したのは、結果の検証方法です。競技プログラミングの問題では、単純に「正解/不正解」の判定しか得られません。そこで、処理の過程を視覚的に確認できるテストコードを実装することにしました。
// マップの状態を視覚的に出力
for (int i = 0; i < hMax; i++) {
for (int j = 0; j < wMax; j++) {
// trueなら黒点「●」、falseなら白点「○」を出力
System.out.print(mapInfo[i][j] ? "●" : "○");
}
System.out.println();
}
このような視覚的な出力により、アルゴリズムの動作を段階的に確認することができ、デバッグも容易になりました。
検証用のコードを含む開発過程のものと、本番提出用にクリーンアップしたコードの両方をGitHubにアップロードしています。
■提出用
■検証用
新しい挑戦から得られたもの
時間はかかりましたが、最終的に問題を解くことができた時の達成感はありました。普段の業務とは異なる種類の問題に取り組むことで、新しい視点やアプローチを学ぶことができました。
また、久しぶりの競技プログラミングは純粋に楽しかったです。実務では味わえないパズルを解く感覚はゲームみたいで楽しいです。プログラミングの楽しさを再確認できました。
他感想
オープニングのストーリーの設定が凝っていてちょっと笑っちゃいました。
他の挑戦者のファイルサイズ見ると信じられないくらい小さくてびっくりしてます。
どう解いたか気になるのであとで見てみようと思います。