システム開発会社が運用するブログ TSTIPS ティーエスチップス システム開発会社が運用するブログ TSTIPS ティーエスチップス

[AtCoder] アルゴリズムのお勉強

2022.01.31

atcoderロゴ

エンジニアとして、アルゴリズムの習得は避けて通れません。大量のデータを効率よく処理するためには、適切なアルゴリズムを使用する必要があります。

「今どきアルゴリズムわからんくても動くもの作れるし」とか言ってるそこのあなた!そして私も!今すぐ反省してください。

今回は、そんな自分を戒めるために、競技プログラミングにチャレンジしてみました。

競プロ入門

競技プログラミングとは?

競技プログラミングとは、読んで字のごとく、プログラミングの技術を競う競技です。

与えられた問題を、いかに素早く、効率よく解けるかを競います。たいていは力業では解けず、アルゴリズムを適切に使用する技術が問われます。

AtCoderでは、競技プログラミングのコンテストを毎週オンラインで行っています。2022/01/22に開催されたコンテストの問題を解いてみましょう。

問題にチャレンジ

AtCoder Regular Contest 133 A- Erase by Valueより引用

問題文

長さ N の整数列 A=(A 1,A 2,⋯,A N) が与えられます. すぬけくんは今から, A の中から一つ値を選びます. ここで選んだ値を x とします. そして,A の要素のうち,x でないものを元の順番を保ったまま並べ,整数列 a を作ります. a としてありうる数列のうち,辞書順最小のものを求めてください.

制約

1≤N≤200000 1≤A i≤N 入力される値はすべて整数である
  • 1≤N≤200000
  • 1≤A i≤N
  • 入力される値はすべて整数である

入力

入力は以下の形式で標準入力から与えられる.

N
A1 A2 ⋯ AN

出力

辞書順最小の a の要素を空白区切りで出力せよ.

ゴリ押し作戦

全パターンを試して、最小のものを出力します。

データが少ないうちはいいですが、入力の最大数が200000なので、計算量が莫大になってしまいます。

実行時間制限でアウト!

シンプル イズ ザ ベスト

ややこしいことは考えず、シンプルに行きます。

辞書順最小ということは、数列の前のほうから調べて、小さい値が前に移動するように取り除けばよさそうです。場合分けして考えてみましょう。

例1: 1 2 3 4
この場合は、最後の4を取り除くと[1 2 3]となり辞書順最小です。

例2: 1 2 2 4
この場合も、最後の4を取り除くと[1 2 2]となり辞書順最小です。

例3: 1 3 2 4
この場合は、3を取り除くと[1 2 4]となり辞書順最小です。4を取り除くと[1 3 2]となり、辞書順では、3の場合に負けます。

以上の方法でクリアできました。

ちょっとした工夫で、計算時間を大幅に短縮できました。

まとめ

世の問題を効率よく解決するために、さまざまなアルゴリズムが考え出されています。先人が編み出したアルゴリズムに学ばない手はありません。

闇雲に答えを探すのではなく、問題の本質を見極めて最適な処理を行えるかが腕の見せ所でしょう。

基本からしっかり身に着けて、良いプログラムが書けるよう精進します!みなさんもぜひ、競技プログラミングにチャレンジしてみてください。

t.kusayanagi

この記事を書いた人

kusa

役職

Company運用会社

株式会社トランソニックソフトウェア

株式会社トランソニックソフトウェア

名古屋市でシステム開発・WEB制作を中心に事業を展開しています。システムに関すること、なんでもお気軽にご相談ください!

Search記事検索

開発パートナー募集中 システムエンジニア、WEBデザイナー積極採用