質問するログイン新規登録
勉強法

勉強法は、効率的な学習方法、タイムマネジメント、記憶術、ツール活用など、技術を学ぶための「勉強のしかた」に関する投稿です。

競技プログラミング

競技プログラミングは、AtCoderやCodeforces、LeetCodeなど、アルゴリズムの実装、学習法などに関する投稿に使われます。

AtCoder

AtCoderは、日本の競技プログラミングサイト「AtCoder」に関する内容です。

意見交換

12回答

1276閲覧

競技プログラミングは初心者の勉強として有益ですか?

rekop

総合スコア2

勉強法

勉強法は、効率的な学習方法、タイムマネジメント、記憶術、ツール活用など、技術を学ぶための「勉強のしかた」に関する投稿です。

競技プログラミング

競技プログラミングは、AtCoderやCodeforces、LeetCodeなど、アルゴリズムの実装、学習法などに関する投稿に使われます。

AtCoder

AtCoderは、日本の競技プログラミングサイト「AtCoder」に関する内容です。

1グッド

0クリップ

投稿2025/09/03 05:31

1

0

テーマ、知りたいこと

初心者が競技プログラミングを言語の勉強のために行なっています。
競プロを続けるべきか、あるいは取り組み方を変えるべきか、今のままで良いのか分からないので先達の意見を聞きたいです。

背景、状況

友人に薦められ、Atcoderを勉強と練習のために始めました。
今はリアルタイムではなく昔の問題から、A問題を中心に解けるまで解いては模範回答を見るという形で進めています。
しかし要求通りのものを作るのは良いのですが、模範回答を見てもなぜこうすると良いのかという理解にあまり役立てることができていないように思えています。
友人に聞いても今は解くだけで十分と言うだけなのですが、どのような力がつくのかなどあまりピンとこなかったため質問させていただきました。

tanat👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答12

#1

fana

総合スコア12285

投稿2025/09/03 05:45

編集2025/09/03 06:14

言語の勉強のため

に,問題を解く必要ってあるんでしょうか?

(私は競技プログラミングの実情に詳しくないので多分に偏見が入ってるかもしれませんが)
わざわざ「何か小難しい数学的な雰囲気の問題に対して,制限時間内に正しい問題を出力するようなプログラムを(可能な限り速やかに?)作る,という競技」みたいな世界の中で「言語の勉強」をしなくてもいいんじゃないかな,と思います.なんというか,「言語の勉強」以外の部分のウェイトが大きくないですか?

プログラミング言語を勉強して,それでどうするというのか? っていうあなたの目的が何かあるのだと思いますが,その目的に即した題材みたいなのが別にあるなら,そっちの方がやりがい(?)があるんじゃないでしょうか.

もちろん,競技プログラミング自体があなたの目的なのであれば,今やっていることが最も理想的なやり方なのかもしれません.
競技~でなくとも,「何か問題を解くのにコンピュータを利用したいから→プログラミングが必要」っていう話ならば「問題を解く」方面の練習も同時にやれて良いのかも?的な.
(でも,そういう場合でも,自分だったら「同時」はきついかなーと思うので, 言語→競技 って感じに段階を設けるかな.)


どのような力がつくのかなどあまりピンとこなかった

それ系の話は「競技プログラミング」と一緒に{役に立つ,勧める,役に立たない,意味ない,使えない}みたいな検索ワードを用いてググったりするといろいろな論が見つかると思うので,見てみると良いかも?
(あまりにも意見がバラバラすぎてさっぱりわからない感もありますが)

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

cametan

総合スコア209

投稿2025/09/03 06:45

個人的には、ハッキリ言って、「競技プログラミングが出来る」ってのと「プログラミングが出来る」ってのは全く関係ない、って思ってる。
実際、「競技プログラミングやってました」って人が、「ソフトウェアの作り方」を知ってる、たぁ限らないんだ。
いや、「競技プログラミングが好きだ」って人を否定してるわけじゃない。
ただし、「競技プログラミングの才覚」ってのと「ソフトウェアを作り上げる」技術って、全く別物なんだよね。
言っちゃえば・・・・・・。
フツーの人と「フードファイター」の差?みたいなもの?「食べること」は生きる事に必要だけど、それは別に「フードファイター」にならんでも出来るでしょ、ってな話であって。「食い物食う」事に「フードファイターの技術」は要らんわけだ。この2つには要求される才覚が全く違う。
それに似てるかな、とか言うのが僕の考え方だ。

ぶっちゃけ、競技プログラミングの問題に「面白い問題がある」ってのは事実なんだけど。
一方、

  • 一般的な最適化論じゃない特殊な(言っちゃえばあまり汎用的じゃない)最適化が求められる。要は汎用的ではない。
  • 言語の対象はC/C++/Java辺りしか対象にしていない。

の二点から、あまり一般的でもねぇんだよな。
まぁ、アルゴリズムの勉強、って言うんでやってる人もいるのは知ってるけど、そもそも「アルゴリズム」って汎用な話であって、「特殊な最適化」はそもそも汎用論じゃないんだ。
したがって、実は突き詰めるとアルゴリズムの話じゃなくなる。
後者の方はホントそう。もちろん主催者側が「うちの問題は言語を選びません!」とか言ってるケースが多いのは知ってるけど、実質的には出題対象がC/C++/Java辺りを想定してるのは間違いないんだよ。
何故なら「出力せよ」で結んでるから(笑)。言語特性的に「出力せよ」ってなってるのは、「要出力じゃないと解が見れない言語処理系」前提で問題作ってるから、なんだよな(笑)。そう、C/C++/Java想定でやってる、ってこった。
と言う事は、出題側が「とある言語を想定してる」以上、実はこっちから見てみても汎用性がある、とか一般性がある問題だ、とはとても言えないって話になるわな。
そういうこった。

残念な事に、実は、「言語によって問題への捉え方」ってのが違う、ってのが事実だ。C/C++/Javaで問題が作られてる以上、たとえPythonやRubyで「回答が投稿出来ますよ」って言っても本質的には「論外だ」って話になる。
結果、仮に貴方がC/C++/Javaを使う、って人ならそこそこ役立つかもしんない。
でも、仮に貴方がPythonやRuby、またはJavaScriptを使う人なら、競技プログラミングをやる事によって「悪い癖が付く」ってのは充分に考えられるんだ。それで言うなら「競技プログラミングをやる事を避ける」方がマシだ、って場合もあるんだよ。
例えば競技プログラミングの問題で「入力値を代入する配列は固定」って想定は、「可変長配列(リスト)」を持ってるPythonでは「不適切だ」って話になる。可変長配列が当たり前のPythonで「固定長前提」の問題を解くと「悪いスタイルになる」ってのは想像に難くないだろう。
同様に、ハードウェア資源が許す限りの大きな整数を扱えるプログラミング言語で、「入力範囲が決まってる」整数を扱う問題を解くのも原理的には不適切だ。「自由な」プログラミング言語で「不自由な」プログラミング言語前提の問題を解くのは、ハッキリ言ってやっぱ「良くないクセを付ける」。

と言うわけで、その友人には悪いけど、明確に「アルゴリズム勉強の為の良問」を解かない限り、むしろ一般的には害の方がデカいんじゃないの?ってのが僕が考えてる事だ。
あとは貴方の言語選択自体なんだけど、繰り返すけどC/C++/Javaユーザー対象以外には、やっぱり競技プログラミングってそんなに役に立たないと思うよ。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

yambejp

総合スコア118098

投稿2025/09/03 07:25

端的にいえば

  • モチベーションがあがるなるならやった方がよい
  • 混乱するだけならやらない方がいい(もっと初心者向けの教材からはじめる)

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#4

u2025

総合スコア85

投稿2025/09/03 09:38

業務プログラミングで未経験を募集していますが、プログラミングができない、つまり業務にあたれないという人はfor文の理解もできていない人です。プログラマーからすると基礎中の基礎なので意識していないとそれができない人がいるということが頭から抜けがちですが、1年かけてもforが分からないというのでは状況的には向いていないと言わざるを得ません。

AtCoderに熱中しているわけではないのでうろ覚えですが、Cレベルぐらいは総当たりでプログラミングの基本的な理解があれば解けるレベルの内容となっているはずです。(といっても、abc以外にもよりハイレベルなクラスもありますが。)
また、C++などでは配列ではなくhash mapの方が探索効率がいいなどデータ構造に関する知識も要求されるケースがあります。

上記の観点からして、プログラミングの基礎的な部分としてA問題が解けないというレベルなのであればA問題を解くことは勉強にはなるはずです。

競技プログラミングに関して、基礎的なアルゴリズム以外でいえば入力と出力がプログラムにおける基本的に要求される能力化とは思いますが、
競技プログラミングはCLI(CUI)でのソフトウェアを想定しているともとらえられるので業務で必ず役に立つかどうかというのは保証できません。

やってみて「ちょっと違うな」と思う場合、その勘を信じて自分が実際に興味のある分野の書籍に当たってみることをお勧めします。
例えばPHPの教材だったら、HTTPの仕組みからアプリケーションの作成方法まで網羅的に教えている分厚い本のもありますし、
単にPHPで入力を受け取ってDBへ保存するだけの薄い本もあります。

基礎的な部分はトラブルシューティングや技術の導入の面でお世話にはなりますが、
競技プログラミングの特に難易度が高いレベル(atcoderでは普通レベル)では、数学的な知識を求められることも多いため業務で役に立つ機会は少ないです。(といってもほとんどはプログラミング言語の研究者でああり構造化プログラミングの提唱者エドガー・ダイクストラが発想したアルゴリズムなので無関係と言い切るのも難しいですが。)

初心者向けに他にも言及すべきことは多々あるかと思いますが、本筋から逸脱しない自信がないためここまでとさせていただきます。

なお、さらに高度なアルゴリズムが解けることや知識を証明できることはそれだけ「学習能力がある」とも評価できるため、間接的に役に立つとも評価することはできます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#5

meg_

総合スコア11027

投稿2025/09/03 10:51

初心者が競技プログラミングを言語の勉強のために行なっています。

競技プログラミングはアルゴリズムの勉強には良いと思いますが、「言語の勉強」には向いていないかと思います。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#6

rekop

総合スコア2

投稿2025/09/04 04:08

みなさん回答ありがとうございます。
言語学習、には向いていないのではということは理解できたような気がします。
ただ実際に解けると楽しいのも事実なので、暇になったタイミングで少しやってみる、などの方法に変えようかなど今は思いました!!
(意見自体はまだまだお聞きしたいので何かあればお願いします。)

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#7

fana

総合スコア12285

投稿2025/09/04 05:23

競技プログラミングは初心者向けなのか? っていう話が以前にもありました.
https://teratail.com/questions/60gso34g9yrlhg

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#8

luuguas

総合スコア506

投稿2025/09/04 07:11

個人的な意見として、まだ言語の基本的な文法などを学習中の段階では、AtCoderのA問題を解き始めるのは時期尚早だと思います。

AtCoderの過去問を解くというのは「数学の小テストを解く」みたいなもので、事前にある程度勉強して内容を理解したうえで、自分に知識が正しく身についているか確認し、もし間違えた問題があれば復習して不足を補うといった進め方をするのが一般的です。

そのため、まだ内容をあまり理解していない状態でテストを解いても当然不正解だらけになりますし、解説を見ても個々の問題への対処法しか書かれていないことが多いので、理解できないあるいは理解するのに時間がかかってしまいます。

ですから、過去問を解くことを中心に勉強を進めるのは効率的ではありません。
いきなりA問題を解き始めるのではなく、まずは言語の基礎を一通り学べる書籍やウェブサイトで勉強して全体を理解し、基本的なコードを書けるようになるのが大切だと思います。

(「プログラミング C++ 学習サイト」などで検索して他の方がおすすめしているウェブサイトで学ぶのも良いですし、個人的には「C++ 入門」のような紙の書籍を1冊買ってしまい、それを読んで学習を進めるのがおすすめです)

一通り基礎を理解したうえで、力試しの場として軽くA問題を解いてみるのは良いと思います。
最初から1個ずつきっちり解こうとせずに、最近出題された問題をいくつか覗いてみて、解けそうだなと思ったものからチャレンジするくらいで良いでしょう。(現時点でABCのA問題だけでも400個以上の問題があるので)

ちなみに過去問一覧はAtCoder Problemsという有志のサイトで確認できます。


ここからは蛇足ですが、多くのA問題を解説を見ずに解けるようになった段階で、さらに上位の難しい問題にもチャレンジするべきか、リアルタイムのコンテストにも参加するべきかについての話になります。

結論から言うと、競技プログラミングは一種の「対戦ゲーム」に過ぎません。

ですから、そもそもやらなくても良し、ちょっと触ってみて好みじゃなければやめても良し、上位を目指さずにゆるくエンジョイしても良し、上位を目指して本気で取り組んでも良し、という風に色んな遊び方があります。
単純な好みの問題なので、どう遊ぶかは難しく考えずに直感で決めてしまって構いません。

また、よく「競技プログラミング(の難易度の高い問題)ができても業務プログラミングには役に立たない」といったことが聞かれますが、これはもちろんその通りで、一般の対戦ゲームにも当てはまることです。

あるゲームでランキング上位をとるために身に着けた専門的な技術が、他のゲームやゲーム以外の分野でも同じように役立つことは少ないです。
同様に、仮に競技プログラミングでデータ構造やアルゴリズムなどを勉強して、難易度の高い問題を解けるようになったとしても、そこまでに得た技術が必ず業務プログラミングでも役に立つ(または正しい)技術である訳ではありません。

そのため、競技プログラミングのためのスキルを上達させようと思った場合、それはあくまで競技プログラミングという限られた領域内でのみ有効なものであることを心に留めておくべきです。

ここまでちょっとネガティブな話をしてしまったので、一時期AtCoderを割と本格的に遊んでいた立場から見た競技プログラミングの良いところも挙げておきます。

まず、競技プログラミングを初めたばかりの頃は、A問題やB問題といった簡単な問題しか解けず時間もかかっていましたが、次第により難易度の高い問題が解けるようになったり、基礎的な問題をより短い時間で解けるようになったりと、少しずつですが上達を感じられるのが楽しいです。

また、定期的に開催されるリアルタイムのコンテストでは、限られた時間内にいかに多くの問題をより早く解くことができるかを他プレイヤーと競うことになり、ライバルとの順位の駆け引きや、自分の実力の指標となるレーティングの増減に一喜一憂するのも1つの楽しみです。
コンテスト後にSNSなどで成績を報告したり問題の解法を共有して話し合ったりと、他プレイヤーとの交流が盛んなのも良い点です。


長文になってしまったので最後にまとめると、

  • 言語の基礎的な内容が分からないうちは、先に基礎を一通り学べる書籍やウェブサイトで学習するのが大事
  • 基礎をある程度理解したうえで、力試しとしてA問題に取り組むのはあり
  • 競技プログラミングも対戦ゲームの1つに過ぎないので、より難易度の高い問題にチャレンジしたり、コンテストに参加したりするかは自分の好みに合わせて気軽に決めて構わない

といった感じです。拙い回答ですが参考になれば幸いです。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#9

fana

総合スコア12285

投稿2025/09/04 10:10

編集2025/09/05 02:41

勉強するのに何か問題的なのがあった方がはかどる,ということなら 宿題 とか良いのかも? とかふと思いました.
なんか「どっかの学校で出されたプログラミングの宿題」みたいなやつ.
(こういう場所で稀に丸投げ質問されてるやつ.でも最近そういうのを見ない感?)

ある程度似たような問題が頻出する傾向があるんじゃないかな? という気がするけど,よく用いられているということは→有用性が高い(?) ということだったりするのかも? みたいな.


言語の勉強のための問題……っていうと
「AをしてBをする,という処理が main 関数内にべた書きされています → AとBをそれぞれ独立した関数として実装し,main はそれを使う形に書き換えてみよう」みたいな方向性かな?
「XXXなる入力が与えられる→なんやかんや頑張って→結果をYYYなる形式で出力をせよ」みたいなのじゃなくて.
まぁ問題がそういうやつだとしても,とりあえず一回作った後に
「別に求められてもいないけども,せっかくだから俺はこの部分を関数にしてみるぜ!」とかなんとか自発的にやってみればいいのかな.

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#10

miyabi-sun

総合スコア21542

投稿2025/09/05 03:40

編集2025/09/05 03:53

質問履歴的に人生相談ばかりしてて、自分から行動を変えた形跡がないように見受けられます。
そして友達に勧められたからやってるって何?
ひょっとしてやらない理由を探しているのでしょうか?

この辺から推測するに多くの一般人と同じで「でもでもだって……」と尻込みしている間にチャンスを逃すタイプだと思います。

質問者さんは本当にプログラマ・システム開発者になりたいのでしょうか?
一度一人になって、自分自身の胸の奥深くに問いかけて見ることをおすすめします。


さて、基本情報技術者の資格を取った後にプログラマとしての道を歩みたければ、
そのまま友人とAtcoderを解き続け、そのスコアを持ってIT企業にポテンシャル採用してもらって、そこからシステム開発に携わるくらいだと思いますね。

これは別に悪い選択肢ではないと思います。

昨今の大学生の平均値で言えば、
スマホの文字入力の速度だけ素晴らしくて、キーボード触らせるとまともに文字入力も出来ない雑魚ばっかりです。
お前らよくそんなんでプログラマを志望したな?
そいつらと比べたらAtcorderで問題解き続けてる!?素晴らしい!ぜひうちに来てくれ!

そして世で活躍しているプログラマの大多数も、
本音の部分では生活の為になんとなく仕事を探したらとか、あまり初対面の人と会話したくないとか、
そんなカスな理由ばっかりです。
流石に就職活動の面接でそんな事は言いませんが。

結局の所、自分の趣味嗜好や向き不向きは変えられないので、
自分の弱点も含めてどう生きていくかの人生設計をしていかなければなりません。


で、Atcorderで解いていてどうでした?
Atcorderがなんかパズル解くみたいで結構性に合ってると思うならプログラマーにも適性あるんじゃないですかね?

すでに20年近く働いているプロとしては、小手先の事は仕事という形でいくらでも後から教えてやれるので、
高校生・大学生のうちはそのまま続けて、地力を高める習慣をつけていれば十分だと思います。

逆にAtcorderを辛い、やめたいという話なら、好きなジャンルと組み合わせましょう。
ゲームのシミュレータやスキル取得の計算機何かを作って見ると良いんじゃないですかね。
これが意外と楽しい、便利につながって、これに◯◯を組み合わせたらもっと良くなるのでは?の連鎖で無限に楽しめます。


しかし要求通りのものを作るのは良いのですが、模範回答を見てもなぜこうすると良いのかという理解にあまり役立てることができていないように思えています。

当然です。

競技プログラミングにおける良い成績ってなんですか?
それは実行速度であり、実行時間です。
叩き出す裏技・ショートカットのオンパレードで常人には理解不能なコード・テクニックが山のようにあります。

ゲームのRTAだって、この村を通過すると強制イベントで10分無駄にしますみたいな話があれば、
隣の崖を連続ジャンプで無理やりよじ登って、村を通らずに向こう側へ行くみたいなズルい事を検討したり実行しますよね。
そういうものの積み重ねで新記録を出す競技ですからね。

話を競技プログラミングに戻して、模範解答と比べて2倍程度の実行時間なら万々歳だと思いますね。
コードの美しさと実行速度の良いところ取りして満足する人種もいます。
競技プログラミングの楽しみ方も人それぞれですからね。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#11

raccy

総合スコア21807

投稿2025/09/05 04:35

将来プログラミングができるようになることが目的で、「色んな問題を解いていく」ことがしたいのであれば、yukicoderAtCoderAOJのような競技プログラミングではなく、paizaラーニングでひたすらスキルチェックの問題を解くことをお勧めします。

paizaのスキルチェックは、競技プログラミングと似たような所があり、問題があり、それを解決するコードを書くと、本当に解決できるか(つまり、仕様書通りのプログラムなのか)どうかを自動的にチェックするという仕組みです。ただ、他にはない特徴が有ります。

  • 模範回答例はありません。解決のための解説もありません。
  • わからなくても他の人に聞いてはいけません。もちろん、teratailでも聞いてはいけません。(本やインターネットで調べるのはOK)
  • 時間制限があります。(制限時間を超えても回答はできます。)
  • 回答するチャンスは1回だけです。(再回答は可能です。)
  • 私の主観ですが、問題の傾向としては、実践で見るような物が多いです。

現実世界では、プログラムを作って解決しようとする問題に対して模範解答は存在しません。解決のための解説書も用意はされません。「凄くできるスッパハカーな同僚」がいることも希なことです。ほとんどの場合、制限時間内に、自分の力だけで、要件通りに動作する(バグがない)プログラムを提出する必要があります。もちろん、提出は1回だけです。動かないプログラムを渡して誤魔化すなんて事は現実には通用しません。

つまり、スキルチェックの問題は現実でのプログラミングにかなり近いシチュエーションになると言うことです。単純なプログラミングの知識だけでは無く、それを生かせる力が無いと解くことは無理でしょう。そういった物が鍛えられると言えます。

なお、最初のDランクは言語の基礎さえわかっていれば解けるような問題がほとんどです。Sランクになると競技プログラミングで出てくるようなアルゴリズムが前提知識に必要ですが、Aランクぐらいまでは底まで知らなくてもなんとかなるようなレベルとなっています。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#12

HoshiMizu

総合スコア84

投稿2025/09/08 01:13

楽しいなら「競技プログラミング」を続けるのは有りかと思います。
色んな言語を勉強してると、視野が広がると思うので。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問