【ITニュース解説】HaskellでABC424を解く
2025年09月21日に「Qiita」が公開したITニュース「HaskellでABC424を解く」について初心者にもわかりやすく解説しています。
ITニュース概要
HaskellでABC424の問題に挑んだ記録。C問題で難航したが、A問題では辺の長さをソートし、特定の条件で二等辺三角形を判断。問題の制約により三角形の成立条件チェックが不要だと気づいた点を解説する。
ITニュース解説
この記事は、競技プログラミングの大会である「AtCoder Beginner Contest」(略してABC)の424回目に、Haskellというプログラミング言語で挑戦した経験について書かれている。特に、A問題を解いた過程が詳細に述べられており、C問題で苦戦した様子も簡潔に触れられている。システムエンジニアを目指す初心者にとって、プログラミングで問題を解決する過程や、特定の言語の特性、そして競技プログラミングという実践的な学びの場について理解を深める良い機会となるだろう。
まず、競技プログラミングとは何かを説明する。これは、与えられた課題(問題)をコンピュータープログラムを使って正確に、かつできるだけ高速に解くことを競う知的スポーツのようなものだ。参加者は様々なプログラミング言語を使い、制限時間内に問題を解くコードを作成し、そのコードが正しい結果を返すか、実行速度が十分か、使用メモリが制限内かといった点で評価される。AtCoderは日本の有名な競技プログラミングサイトで、ABCは初心者から中級者向けの入門的な大会として位置づけられている。
次に、記事で使われているHaskellというプログラミング言語について解説する。Haskellは「関数型プログラミング」という考え方に基づいた言語だ。多くのプログラミング言語が、命令を順序立てて実行していく「命令型」であるのに対し、Haskellは数学の関数のように、入力に対して結果を返す「関数」を組み合わせてプログラムを構築する。この特徴により、Haskellで書かれたコードは非常に簡潔で、一度定義された値が変更されない「不変性」や、プログラムの状態を変化させる操作である「副作用」を厳しく制御することで、高い安全性と予測可能性を実現している。そのため、大規模なシステム開発や、並行処理が必要な場面でその強みを発揮する。初心者にとっては、他の言語とは異なる独特な考え方に慣れるまで時間がかかるかもしれないが、一度習得すれば、より抽象的な視点から問題を解決する力を養うことができる。
記事で特に詳しく述べられているのはA問題の解決方法だ。A問題は、与えられた3つの辺の長さが等辺三角形を構成するかどうかを判定するという内容だったようだ。等辺三角形とは、少なくとも2つの辺の長さが等しい三角形のことだ。筆者はこの問題を解くにあたり、「ソートして最初の2つか最後の2つが同じ長さなら等辺三角形と判断」という方法を採用した。ソートとは、複数の数値を小さい順や大きい順に並べ替える処理のことだ。例えば、辺の長さが5、3、5と与えられた場合、これらをソートすると3、5、5となる。この結果を見ると、最後の2つの辺(5と5)の長さが等しいことが一目でわかるため、等辺三角形と判定できる。また、もし辺の長さが7、7、4であった場合、ソートすると4、7、7となり、最初の2つの辺(7と7)が等しいと判断できる。このように、与えられた辺の長さをソートすることで、どの辺が等しいかを効率的かつシンプルに判定できるのだ。
さらに重要な点は、筆者が「辺の長さに意味があるかをチェックしたが問題の制約で必ず3角形が存在するので2辺の長さがもう1辺よりも長いというチェックはしなくて良かった」と述べていることだ。通常、3つの辺の長さが与えられたとき、それが実際に三角形を形成するためには、「どの2辺の長さを足しても、残りの1辺の長さより大きくなる」という条件を満たす必要がある。例えば、長さが1、2、10の辺では三角形を作ることはできない。しかし、このA問題では、問題文の「制約」として、「与えられる辺の長さは必ず三角形を形成する」という条件が保証されていたため、この三角形の成立条件をプログラムでわざわざチェックする必要がなかったのだ。これは、競技プログラミングだけでなく、実際のシステム開発においても非常に重要な考え方だ。問題や要件の制約を正確に理解することは、無駄な処理を省き、よりシンプルで効率的なコードを書く上で不可欠となる。不必要な処理を含めると、コードが複雑になるだけでなく、実行速度の低下やバグの原因にもなりかねないからだ。
この記事が示しているのは、単に特定のプログラミング言語を使って問題を解く技術だけではない。競技プログラミングに挑戦すること自体が、システムエンジニアを目指す上で非常に有益な経験となることを教えてくれる。与えられた問題を論理的に分析し、最適なアルゴリズムを考案する「問題解決能力」が鍛えられる。Haskellのような異なるプログラミングパラダイムを持つ言語に触れることは、プログラミングに対する視野を広げ、多様な思考法を身につける機会にもなる。また、C問題で苦戦したという記述は、プログラミング学習や問題解決において失敗はつきものであり、そこから学び、改善していく姿勢が成長につながるという大切なメッセージを伝えている。論理的思考力、効率的なコードを書く意識、そして粘り強く課題に取り組む姿勢は、将来システムエンジニアとして活躍するために不可欠な資質となるだろう。