質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

意見交換

クローズ

20回答

4964閲覧

競技プログラムについて教えてほしい。

Konya

総合スコア10

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2023/07/05 07:37

1

0

概要

現在質問で初心者にお勧めの文庫を聞いていた際に「競技プログラミング」をお勧めしてくださる方がいました。「競技プログラミングをすることによって、様々な役立つ情報を学べるので初心者にも非常にお勧めです。」と書かれており少し興味を持って調べると初心者にお勧め!みたいな記事を多数見かけました。

ですが、その後熟練の方が同じ質問箱で初心者にはやめておいた方がいいという反対意見を教えてくださる方もいて正直よくわからなくなってます。

競技プログラミングは初心者向けなのか教えてほしい。

ちょっとしたコードしか書けない人間が進むべき道なのか参考までに教えてください。
利点とかこういうことは気を付けたほうがいいとかあれば教えてください。
よろしくお願いします。

yuma.inaura👍を押しています

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

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

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

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

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

回答20

#1

fana

総合スコア12151

投稿2023/07/05 08:12

編集2023/07/05 08:37

話の出所 を(このように)リンクで示すと良いかと思います.

リンク先の 11 の意見には勧める理由が書かれていますし,
12, 13 の意見には気を付けた方が良い点が書かれています.
(私の偏見じみた意見は 12 です)


それとなく参考になるんじゃないかなという例
(こんな状態に陥るようであれば,お勧めしないかな,っていう)

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

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

#2

can110

総合スコア38352

投稿2023/07/05 08:34

意見交換の場なので、まずはご自分の意見を表明するほうがよいと思います。

かりに「初心者だから意見がない、分からない」としても、すでにこの質問について調べて多数の記事も読んだと思いますので、その内容をまとめて、それに対する感想とともに箇条書きにしていくこと程度はできるはずです。

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

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

#3

AbeTakashi

総合スコア4902

投稿2023/07/05 08:43

まずはやってみればいいんじゃないでしょうか? お金がかかるもんでもありませんし、事故で怪我をするようなこともほぼないです。

勧める人、勧めない人それぞれ多くいると思うので、そういう意見を色々聞いても判断できないと思いますよ。あなたのパーソナリティや技量もここの人たちは分かりませんし、こういうところで質問しても的確なアドバイスは出ないと思います。

「競技」と名が付いてますので、スポーツみたいなもんです(eスポーツに分類されるとも言われています)。突き詰めていくのであれば当然ですがストイックな世界です。当然、人によって合う、合わないがあるので、まずは自身で扉を開けて中を覗いて体験入学して、ご自身で判断するしかないと思います。

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

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

#4

can110

総合スコア38352

投稿2023/07/05 08:49

Chat-GPTの回答

競技プログラミングは、プログラミングのスキルを向上させるための非常に有益な活動ですが、初心者にとってはいくつかのメリットとデメリットがあります。以下にそれぞれの詳細を説明します。

メリット:

  1. アルゴリズムとデータ構造の理解: 競技プログラミングでは、効率的なアルゴリズムとデータ構造を使用して問題を解決する必要があります。この過程で、様々なアルゴリズムやデータ構造について学び、実際の問題にどのように適用するかを理解することができます。

  2. プログラミングスキルの向上: 競技プログラミングは、問題解決能力や効率的なコーディング技術を養うのに役立ちます。プログラミングの課題に取り組むことで、より洗練されたコーディング手法を習得し、プログラミングスキルを向上させることができます。

  3. チームワークと協力: 競技プログラミングは、チームで取り組むこともあります。競技プログラミングコンテストでは、他のメンバーと協力して問題を解決することが求められることがあります。このような経験は、チームワークや協力のスキルを向上させるのに役立ちます。

  4. プログラミングコミュニティへの参加: 競技プログラミングは、プログラミングコミュニティに参加する良い機会です。コンテストやオンラインプラットフォームを通じて他の競技プログラマーと交流することで、知識や経験を共有し、新しい友人やメンターを見つけることができます。

デメリット:

  1. ストレスと時間制約: 競技プログラミングは、時間制約のあるコンテスト形式で行われることが多いため、ストレスを感じることがあります。問題を解決するための制限時間があるため、パフォーマンスや効率にプレッシャーを感じることがあります。

  2. 専門的な知識の必要性: 競技プログラミングでは、アルゴリズムやデータ構造に関する知識が必要です。初心者にとっては、これらの専門的なトピックに対する理解を深めるために時間と努力が必要になるかもしれません。

  3. 創造性の制約: 競技プログラミングは、特定の問題を解決するための最適解を見つけることに焦点を当てています。そのため、創造性や自由度が制約されることがあります。一方で、実際の開発プロジェクトでは、問題の定義や要件が明確でないことが多いため、競技プログラミングのスキルだけでは不十分な場合もあります。

  4. プロジェクト全体の視点の欠如: 競技プログラミングは、個々の問題に焦点を当てるため、大規模なプロジェクト全体の視点を持つ機会が少ないかもしれません。実際の開発では、個々の問題を解決するだけでなく、プロジェクト全体の構造や設計についても考慮する必要があります。

競技プログラミングは、プログラミングスキルの向上や問題解決能力の開発に役立つ一方で、時間制約や専門的な知識の要求などのデメリットもあります。初心者の場合、基礎的なプログラミングの理解を深めると同時に、自分に合ったバランスを見つけることが重要です。

おおむね同意です。
とくにデメリットの1.。AtCoderなどのコンテストだと時間も決まっているので参加するのが億劫になりました。
マイペースで過去問解く分にはいいですが。

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

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

#5

yambejp

総合スコア117674

投稿2023/07/05 09:44

むずかしいところですよね。
ゴルフクラブも持ったことがないのにいきなりラウンドにでてボロボロでもう二度とゴルフなんかやらない・・・ってなるよりはある程度打ちっぱなしで感触掴んでからのほうがよいでしょうし。
ゲームのチュートリアルとかも同じですよね。ゲームの中盤くらいになって行き詰まってるとき友達から基本機能を教えられてそんな便利な機能あったのかマジか!となることもままあります。

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

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

#6

TakaiY

総合スコア14291

投稿2023/07/05 10:29

職業プログラマをしています。

競技プログラミングは、ああいう種類の問題を解くのが好きで勉強したり解いたりしていますが、実際の競技は、スキルも知識も追いつかないのでやったことはありません。

実際の業務で役に立ったことがあるかといえば、そのアルゴリズムなどそのものについては、ほとんどありませんね。
ただ、手法というか、問題を読んで解決方法を複数考えて、それぞれを評価して、実装してみて、結果を出して、ここでもいろいろ評価して、改善して、というような開発の流れについては、業務プロジェクトの遂行においても同じようなことをしています。 ただ、これは競技プログラミングでなくても得られるスキルです。

初心者がすべきかというのは、個人の趣味・指向・資質によるのでなんとも言えません。プログラミング始めて数ヶ月で競技に参加しているなんて人を複数知ってますし。

「将来役にたつならやる」つもりならやらないほうがいいでしょう。「おもしろそうだからやってみよう」というのなら応援します。

競技プログラミングの課題を、競技としてではなく、純粋に問題を解くためにやるのもいいと思います。元スレで指摘されているような「悪習」は、短時間で仕上げるためにそうなるのであって、ちゃんと時間をかければきれいなコードになるでしょう。Project Euler(個人的には好き)みたいな、競技ではなく、単に問題を提供しているサイトもありますし。

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

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

#7

Konya

総合スコア10

投稿2023/07/05 11:34

#2 さん。
個人的な意見ですが、現段階ではやらない方向に進もうかなと考えています。
まだまだ、浅いのもありますが悪い癖がつくというのも見かけたので今はやめておいた方がいいのではないかと思っています。ただ、検討はしてみたいなと考えています。

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

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

#8

pig_vba

総合スコア808

投稿2023/07/06 01:31

個人的に競技プログラミングやProject Eulerなどは「趣味として割り切れるならとてもお勧めする」派です。
職業プログラムの勉強として行うには些か遠回りすぎますが、逆に普段の仕事とは違う思考でプログラミングできるので勉強や仕事の息抜き(リフレッシュ)の手段としては優秀であるという側面もあります。あくまで仕事や勉強ではなく、趣味の延長としてもプログラミングを楽しめる人にはお勧めな世界ですね。

以下個人的解釈

スポーツと解釈する方が多数派ですが、個人的にはゲームのエンドコンテンツの一種と解釈しています。
エンドコンテンツなのでメインパート(普段の仕事)には絡みませんが、やりこみ要素の塊なので時間と気力の許す限り無限にやりこむ(上のスコアを目指す)ことができる点が一致してますね。
Project Eulerなんかは正にエンドコンテンツしかないクイズゲームみたいなものです。(死ぬほど難易度高いですけど)
当然エンドコンテンツなので無理してやりこむ必要も皆無です。息抜き代わりや暇つぶしに触ってみて、疲れたり飽きたりしたらスパッと切り上げるくらいがちょうどいいと思います。

もし今後ちょっとやってみようかなって思われたときは新規ゲームに触れるような気分で気楽に試してしまっていいかなぁと思います。やっぱり合わないなってなったらそのタイミングで辞めてしまえばいいだけですから

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

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

#9

退会済みユーザー

退会済みユーザー

総合スコア0

投稿2023/07/06 09:21

前回競技プログラミングを薦めた者です。返信遅くなってすみません。
あくまで、私は「初心者が勉強するのに適した方法」として競技プログラミングを提案したので、少なくとも勉強の序盤には確実に知っておいたほうが良い知識がたくさんあります。例えば、計算量(オーダー記法)、2分探索や累積和、組み込みのデータ構造などですね。

昔ネットでこんな記事が出ました。

Pythonで"in list"から"in set"に変えただけで爆速になった件とその理由(https://qiita.com/kitadakyou/items/6f877edd263f097e78f4)

これは、Pythonである数がリストの中にあるのかを判定するのに、listではなくsetを使ったら高速で動くようになったという内容の記事です。
しかし、競技プログラミングをやっている人にとっては、PythonのlistがO(N),setはO(1)ですから、setの方が高速なのは当たり前の知識です。この方は現役のプログラマであることからも、実際に「実務には役に立たない」と言い切ることはできないでしょう。むしろ、競技プログラミングで他の方とも差をつけられます。

とはいえ、現役の方は競技プログラミングには実務(実際に仕事やグループで開発をする)には役立たないとおっしゃる方もいます。
競技プログラミングをするデメリットとして、次の2点が挙げられます。

・競技プログラミングは書き方が汚い。また、競技プログラミングで推奨されているものの実務では使わないほうが良いものがある(C++のusing namespace std, グローバル変数の乱用, その他変数の名称等)
・競技プログラミングでアルゴリズムを学んでも、実際の開発に役立つ機会はない。どれだけ勉強しても競技プログラミングでしか役に立たない

前者について、競技プログラミングにおいて一般的に言われることです。しかし、競技プログラミングを勉強しているうちに、これは独特の書き方、というのも分かるようになります。
そして、何より質問者さんはまだ初心者なのですから、誰でも教えてくれて、すぐ直せるような綺麗な書き方を学ぶよりも、様々な知識を身につけたほうが良いです。英語の勉強で最初のうちは細かいニュアンスや~~では使わないといった細かい点より、まずは単語や文法をガンガン身につけたほうが良い、というのと同じです。
後者に関してですが、これは相当やりこまない限り「実務で一切使わない」というラインまで行くことはなく、むしろ実用的なものが多いです。競技プログラミングもプログラミングですから、あなたの開発にも役立つことでしょう。

最後に、特に私が言わせてほしいことなのですが、
競技プログラミングをやっている人は、まるで競技プログラミングの書き方をそのまま実務で使うような勝手な印象を持たれがちです。競技プログラミングのコードを見て、「変数の命名雑すぎ!これだから競技はダメだ!」みたいな。早く書くことが命なのですから当たり前です。変数の命名なんて書きかえれば一瞬で済むことですし、他の要素も実務で使う人なんていません。自分も理解できなくなってしまいますから。
ですから、競技プログラミングに変な偏見があるのは、そのような背景があることも知っていただきたいと思います。

まずはやってみることをお勧めします。大丈夫です。「悪い癖」じゃなくてあくまで「書き方のちょっとした違い」ですから。

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

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

#10

Zuishin

総合スコア28673

投稿2023/07/06 09:41

最初に触れた物を普通と思ってしまう認識阻害効果、つまり癖というものは、普通に見えるものを見えなくしてしまう結構厄介な代物なので、可読性と再利用性と保守性が高い書き方を最初から意識しておく必要があります。

アンチパターンについて色々書きましたが、その中で唯一認識された「命名」は一番認識しやすく直しやすい癖です。

競技プログラミングをするなとは言っていませんが、そのコードには変な癖があることだけは知っておかないと、いつでも簡単に直せると思ってしまいます。

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

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

#11

退会済みユーザー

退会済みユーザー

総合スコア0

投稿2023/07/08 11:54

プログラミングの文法とはあくまで手順の表現にすぎず、関数やアルゴリズムの知識が乏しい状態でコードを書こうとしても良いものは生まれません。例えば何の工夫もなくじゃんけんゲームを作ろうとした場合、生まれるコードはif文の繰り返しです。そのコードは読みづらいですし、文法が完璧であってもokだとは思えません。もっとスタイリッシュな書き方があるでしょう。
そのような点から、実装の工夫やその実現のためのアルゴリズムも、ある意味コードの文法の一部とも言えます。競技プログラミングでは短く書くことが大切ですから、そのような(細かい文法は除いた)「形」はよく使われます。
そのため、競技プログラミングに取り組むのは、プログラミングの一部のスキル向上に大きく役立つことでしょう。文法のスキルは、実際にゲームなどのコードを書く際に意識すると身につくと思います。

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

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

#12

Zuishin

総合スコア28673

投稿2023/07/08 12:07

編集2023/07/08 12:11

スタイリッシュかどうかという判断基準は一番後でいいです。

何のためにクラスを作るのか、などの基本中の基本がごっそり抜けていると、コード全体を再利用もできない意味不明な単一クラスに詰め込んでしまうかもしれないし、更にはインスタンス作成時にコンストラクタで全ての処理を行ってしまうかもしれないし、それを指摘されても何が悪いのかわからずキョトンとしてしまうかもしれません。

初心者ならそれでも構いませんが、誰かを無能呼ばわりし、他の人にアドバイスをするのであれば、もう少し基本を身に着けないと、なぜ初心者が上からアドバイスするのかと笑われてしまいます。

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

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

#13

退会済みユーザー

退会済みユーザー

総合スコア0

投稿2023/07/09 00:42

クラスの慣例が基本中の基本というのは嘘です。そんな重要ならpythonドキュメントに大きな文字で書いてあることでしょう。それよりあなたは文法が得意なんでしょう?試しになんか書いてみてくださいよ、あなたの思う良いプログラムを。

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

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

#14

Zuishin

総合スコア28673

投稿2023/07/09 02:35

編集2023/07/09 02:51

クラスの慣例が基本中の基本というのは嘘です。

慣例ではなく、何のためにクラスを作るのかと書きました。
そのように、基本的なことを言われても全く意味がわからず「慣例」「スタイリッシュ」と独自解釈してしまうほど考え方が捻れていることを「癖」と表現しています。

この癖を直すのは非常に難しいというのが私の意見で、あなたは自ら良いサンプルとして実証してくれています。

なぜクラスを作るのか、オブジェクトにはどういう意味があるのかを Python のドキュメントに書いていないとしたら、逆にそれこそが知っていて当然の基本中の基本であることの傍証となるでしょうね。

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

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

#15

Zuishin

総合スコア28673

投稿2023/07/09 05:55

編集2023/07/09 06:38

このように、一度ついた癖を後から矯正することは非常に難しいという結論になります。

クラスを作ることを無駄な慣例としか認識できなくなり、どういう癖がついているかを教えて貰っても何も耳に入らず、スタイリッシュだけど無意味なコーディングを押し付けられたと思い込むようになります。

最後には、癖を教えてくれた親切な人や自分の属するコミュニティに暴言と八つ当たりを始める人もいます。

競技プログラミングはけして悪いものではありませんが、プログラミングを覚えるために始めるのはこのように危険度が高いので重々注意するのが良いでしょう。

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

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

#16

pig_vba

総合スコア808

投稿2023/07/10 09:04

質問者からすればどうでもいいレスバ会場になって話が大気圏外に脱線したので一旦纏めると、

  • 競技プログラミングに触れること自体は止めないよ。でも初めから学習教材として使うのはお勧めしないよ
  • 基本的に経験者前提の難易度だから初心者が取り組むには平均よりかなり多くの時間がかかるよ
  • アルゴリズムやプログラム自体の知識より、問題解決能力や解決手法、汎用知識の+αの部分に近いと思うよ(これは私の個人的な解釈です)
  • メリットも大きいけど、同様にデメリットもそれなりにあるよ。よく吟味しようね
  • のめりこみすぎたり無理をして先に進もうとするとストレスになって逆効果だよ
  • ハマるかどうかは個人差があるから遊びのつもりで触れてみてそれから考えるって手もありだよ

こんなところですかね。

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

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

#17

Zuishin

総合スコア28673

投稿2023/07/10 09:16

競技プログラミングで変な癖がつくと聞いたが、初心者に勧めている人もいる。
どちらが正しいのか?

というのがこの質問の趣旨で、私は一貫してそれに答えています。
大気圏外に勝手に飛び立っていった人のことはこれ以上触れる必要無いのでは?

繰り返しになりますが、競技プログラミングでよくみかけるプログラムはアンチパターンの塊です。
アンチパターンを基準にしてしまうと、大気圏外に飛び立つことになるでしょう。
まず、何が基本なのかだけは押さえておく必要があります。

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

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

#18

Zuishin

総合スコア28673

投稿2023/07/10 09:35

最初に「守」を選ぶ人は、自分をわきまえ、短期間でしっかりと成長したい人です。

最初に「離」を選ぶ人は、「守」がつまらないというのがその理由です。

どちらを選ぶのも自由ですが、後者で目的が果たせるのは天才だけでしょう。
天才なら他人の意見を聞かず好きにすればいいと思います。

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

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

#19

fana

総合スコア12151

投稿2023/07/11 02:00

編集2023/07/11 02:11

プログラミングの勉強というか練習みたいなのが目的なのであって,且つ,「何かしらの「問題」(というか「お題」とでもいうか)が目の前にあると,とっかかりやすい」的な話の場合…

「競プロ」みたいなやつとはまた別の手段としては,「こういう場所で回答行為をしてみる」もあり得るかな.

  • 回答が間違っているとかあまり良くないとかいう場合に,(運が良ければ,だが)「何がどう 違う/良くない のか」みたいな話が投下される点がメリットかと.可否のみが2値的に伝えられる形態と比べると,断然役に立つと思う.
    あと,取り扱われる話の内容が基本的に「実際の取り組みの中で生じた話」であるから,自身も将来に目の当たりにしていたかもしれない問題みたいなのに遭遇する可能性もある,とか.(確率的に言うほどでもないかもしれなけれども…)

  • デメリットについては丁度その裏返しで,運が悪いと「可否すら不明というか完全放置される」点と,「自身に相応に関係ありそうな話というのは,何だかんだあまりないかもしれない」という点かな.(あとは場合によっては「相手が人である」という点も?)

  • 極稀に「競プロ」系の問題に関する質問も目にするけど,そういう「質問」に関わろうとする場合,その問題への関わり方というか視点みたいなのが普通にその問題を解く場合とはちょっと変わってくる…ことになるのかな?

  • コードの書き方みたいな点については多分ほぼ参考にならない.(という点は「競プロ」と同様)
    示されるのは「話ができる必要最低限の形のコード」みたいなのが多いし,変数名とかも "Hoge" だとかそんなのになってることが多いし.

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

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

#20

YuuT

総合スコア673

投稿2023/08/17 01:57

個人的には、競技プログラミング(以下、競プロ)は競技としてプログラミングを行う(要件に沿ったプログラムを作る)ものなので、プログラミングや学習に対して競技要素があるほうがやりやすい場合は、競プロをするのが良いと思います。
確か入門者向けの問題もあったはずなので、いきなりランカーとはいかないと思いますが、競技性を求める(周囲の人と競ったほうが成長しやすいなど)場合には初心者でも有用だと思います。
しかし、競技性を求めない場合は、自分なんかもそうですが初めてどの問題も解けずに誰かに勝ちたいとかランクを勝ち取りたいとかも思わないのでかなり続けるのは辛いものになると思います。
その場合は、似たようなものにプログラミングスキルチェック(自分の知っている範囲ではpaizaなど)があるので、こちらのほうが競技性も薄く、学習向けだと思います。(スキルレベルというランクは付きまといますが)

競プロはあくまで競技であり、(確か)実行速度重視なので、業務なら複数行で書くコードを1行にまとめたり、簡単な変数名(a, bとか)にしてスピードを出すとかのテクニックが重視されるようなので、他人と共有するようなコードは書きにくいですが技術として必要である無駄の少ない、速く処理するプログラムをかける技術が上がると思います。
それに対してプログラミングスキルチェックなんかは確か模範解答もあったはずなので、(解答がずさんでなければ)他人と共有するようなコードの書き方を中心に学べると思います。(いわゆる日本とかで仕事をする場合はこっちかと。海外だと読めないやつが悪いvs読めないコードを書くやつが悪い派閥がいる印象です)

とりあえず、競技性を求めるのであれば競プロを、競技性がないほうが学習しやすいのであればほかの書籍やサービスをお勧めします。
また、いろいろ回答あるように、なんでも一長一短あるので、現状自分の中で一番重視しているもの、例えば速いプログラムが正義とか仕事として共有できるコードを書きたい(書くことが正義)を指標にそれに沿った教材を選べればよいと思います。

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

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

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問