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

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

新規登録して質問してみよう
ただいま回答率
85.46%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

4回答

3639閲覧

プログラミングコンテストの問題文を読み解く読解力を身に付けるにはどうすればいいか?

omologic

総合スコア6

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

1グッド

0クリップ

投稿2020/04/19 06:35

前提・実現したいこと

プログラミングコンテストの問題文の読解力を身に付けたい、その方法を教えてほしい。

発生している問題

プログラミングコンテストの問題文を理解することができません。

具体的な例としては、
以下ページに記載の辞書順比較で s<tを満たす要件の文章の意味が分かりません。
https://atcoder.jp/contests/abc042/tasks/abc042_b

(記法が特殊で、適切な書き換え方法が分からないな為、ページ先参照とさせていただきます。)

補足情報

35歳ながら、プログラムを本格的に勉強しようと奮起しています。

例に出した問題では、私はc言語で学んでいるのでstrcmpを利用した比較でおそらく、問題はクリアできると思うのですが、そうではなく、私はこういった問題文を読み解く、読解力を身に付ける方法を知りたいです。

なにか参考になるサイトや資料、書籍などはありますでしょうか?

恥ずかしながら、学生時代に真面目に勉強してこなかったので、
なにか前提知識が不足しているのではないかと思っております。

ご指導いただければ大変幸いです。

dodox86👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

確かに読みにくいですが、同じ記号は必ず同じもの、違う記号は必ず違うものを指すものとして、よく読む以外無いのではないでしょうか。

まず s = s1 s2 s3 ... sn ですが、n 個の文字列を組み合わせた文字列を表します。

いろはちゃんが持っているのは S1, S2, S3, ... SN ですが、この S と s、また N と n は大文字小文字が違うので違うものを意味します。
N 個の文字列の中から n 個選び、任意の順番で並べたものが s = s1 s2 s3 ... sn になります。
同様に、m 個選び、任意の順番で並べたものが t = t1 t2 t3 ... tm です。

これの大小の定義が問題の箇所ですね。

ある整数 i(1≦i≦min(n,m)) に関して、1≦j<i を満たす任意の整数 j において sj=tj が成し、かつ si<ti が成立する。

まず、カッコ内は読み飛ばしましょう。ある整数 i に関しての記述ということがわかります。
それからカッコ内を読みます。1≦i≦min(n,m) とあります。
これは i の取りうる値の範囲を示しています。
i は 1 以上 min(n,m) 以下の範囲を取ります。
min は引数のうち小さい方を返す関数ですね。よく出る表現なので、覚えてください。

n と m は既に出てきました。s の桁数が n 桁で、t の桁数が m 桁です。
つまり、s と t の桁数のうち、i は小さい方以下の数であることがわかります。

次の条件より、j もやはり桁数ですが、1 以上 i 未満であることがわかります。これはインデックスですね。i, j, k は配列のインデックスを表すのによく使われます。
i 未満の任意の整数 j において sj=tj が成立するというところより、文字列を順番に前から比較していき、i 桁より前ではすべて一致すると書いています。
そして si<ti なので、i 桁目では s の方が t より小さくなるという意味になります。
これを普通の日本語で読むと、「頭から読んでいき、初めて違う文字列が出てきたとき、それを比較して小さい方の文字列が含まれる方が小さい」となります。

次の条件も同様に読んでください。それぞれの記号が何を表しているかを注意深く覚えながら読むのが大事です。

投稿2020/04/19 07:38

編集2020/04/19 07:43
Zuishin

総合スコア28662

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

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

dodox86

2020/04/19 07:56

注意深く何度も読んで云わんとしていることを理解するのが大事ですね。 AtCoderの問題は、初歩の数学的な表記で条件を示すことも多いように思うので、そのあたりの表記に慣れるのも一手かな、と思います。サンプル問題の入力と出力結果でその理解を検証することもある程度できると思います。
Zuishin

2020/04/19 08:00

そうですね。わかりにくければ飛ばして次を読み、全体を大雑把に把握してから詳細を確認するのは使える手だと思います。
omologic

2020/04/19 09:34

丁寧にご回答いただきありがとうございます。 ご回答と問題文をじっくり読みなおしていたため、お礼にお時間がかかってしまいました。 Sとs、Nとnが別物というのはなんとなくは分かっていましたが、 改めて名言いただいたおかげで頭のなかがスッキリしました。 そもそも私が混乱していた原因は各S文字列は文字列の長さが同じはずなのに、文字列比較の条件においては長さが違うことを前提に説明していたからでした。 すいません、追加で質問させていただいて恐縮ですが、 「任意の整数」 というのは 厳密には意味がことなるものの「各整数」と言い換えることができるという理解でよろしいでしょうか? そうなってくると 「ある整数」も「任意の整数」も同じ意味であるという理解でよろしいでしょうか? 順番に前から比較、というところまでが、自分の理解力では到達できなかったところですが、各整数と置き換えれば、順番に前から比較というのがなんとなく理解できるような気がします。
omologic

2020/04/19 09:37

>dodox86さん、 Zuishinさん 正直ほとんどの問題は問題文をよく読まずに解いてしまっています。 しかし、少しでもアルゴリズム要素が入った問題になるととたんに解けなくなり、数稽古だけではレベルアップが難しいことを実感しておりましたので、読解能力の問題かと思っておりました^^;
Zuishin

2020/04/19 09:39

「任意の整数」とあった場合は、「範囲内のどの整数においても」という意味になります。 「ある整数」は、「範囲内の整数のうちどれか一つ」という意味になります。 つまり、「任意の整数において次の条件が成り立つ」と書いてあったときは、範囲内のどの整数においてもその条件は成り立ちますが、「ある整数において次の条件が成り立つ」は、範囲内のどれか一つの整数において条件が成り立つが、範囲内にはその条件が成り立たないものも存在する可能性があることを意味します。
Zuishin

2020/04/19 09:43

この問題で「ある整数」と書かれているのは、同じ文字列が並んだ最後尾より一つ後のインデックスを指しますので、「任意の整数」ではいけません。この「ある整数」は「ある特定の整数」になります。
dodox86

2020/04/19 09:54 編集

>omologicさん > 正直ほとんどの問題は問題文をよく読まず...(略)...読解能力の問題かと思っておりました。 それは改めないといけないのでは。読解能力は含まれると思いますよ。昨今の学力事情で、数学について母国語の能力の低下が関連して問題視されているのと重なる部分かと。アルゴリズム要素が問題にどう適用できるか考えるのも、そこに依存してくると思います。
omologic

2020/04/19 11:51

度々ご解説ありがとうございました。 該当のサイトが英語版への切り替えが可能なことを失念しておりましたが、 さきほど切り替えたところ、たしかにおっしゃるとおり、 「ある」はan 「任意の」はall に対応しておりました。 これで頭の中がだいぶスッキリしました。 ようやく読解できたように思います。(検討自体はついていましたが、文章からそこまでの理解に至りませんでした。) 理解内容を文章に理路整然と落とし込むことができないのがまた要改善ですが、私の理解は以下のようなところです。 ・文字列上の特定番目の文字が他方より小さく、かつそれ以前のすべての文字が同じ ・文字列の長さが他方よりも小さく、かつ小さい方の最後尾より前の文字がすべて同じ 上記のいずれかに該当する場合、一方の文字列は他方の文字列より辞書順比較で小さいといえる。
Zuishin

2020/04/19 12:24

それで合っているはずです。この問題は読みにくいほうだと思うので、もうたいてい読めるのではないでしょうか。
omologic

2020/04/19 12:36

大変助かりました! コロナのこともあり、勉強時間はとれたのですが、 壁にぶつかってからは悶々とした日々を過ごしておりましたが、 このように親切に教えていただけて、モチベーションもアップしました。 大変ありがとうございます。
guest

0

プログラミングというよりは、数学の文章題を読む能力(訓練量)の問題なのかなという印象です。

結城浩さんの著書を簡単なものから読んでいくと数学的な文章の読み方の訓練になると思います。

  • プログラマの数学 第2版
  • 数学ガールの秘密ノートシリーズ

あたりがお勧めです。

投稿2020/04/19 07:55

tanat

総合スコア18716

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

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

omologic

2020/04/19 11:25

書籍のご紹介ありがとうございます。 おっしゃるとおり、数学的な文章の読解力に問題があると感じておりますので、まさに知りたかった情報となります。 が、ひとまず、該当の問題文章の読解を試みて、どうしても無理そうだったらぜひ当たってみたいと思います。
m.ts10806

2020/04/19 12:35 編集

本題とは若干それますが、結城浩さんと言えば、teratailの「質問するときのヒント」のもとになった文章も書かれている方ですよね。 https://www.hyuki.com/writing/techask.html 「伝える力」「くみ取る力」双方を身に付けることが大事ですね。
omologic

2020/04/19 12:33

ご丁寧にありがとうございます! ぜひ拝見させていただきます!
tanat

2020/04/19 13:20

> omologicさん 解決したようで良かったです。 数学的な文章を使うかどうかは分野によって大きく変わりますが、 仕様を正確かつ一般化して表現する(もしくは一般化された仕様を読み解く) という能力はどの分野でも必要で、 プログラミング自体は出来ても仕様を書いたり読んだり突っ込んだり出来ない人は結構な割合で存在するので、その辺りがしっかり出来ることは大きな武器になるかと思っています。 頑張ってください!
tanat

2020/04/19 13:22

> m.ts10806さん > teratailの「質問するときのヒント」のもとになった文章も書かれている方ですよね。 あ、そうなんですね。元の文章は読んだことがありますが、「質問するときのヒント」の元になったのは知りませんでした。 他者との理解の共有と言う点でとてもためになる文章を書かれる方ですよね。
m.ts10806

2020/04/19 13:41

tanatさん はい。気づきにくいですが、最下部にこんな一文があります。 > ※この文書は、結城浩さんの「技術系メーリングリストで質問するときのパターン・ランゲージ」を参考にし、作成しています。 失礼ながら名前を存じ上げなくて、ただ、見覚えがあったので確認したら「やっぱりこの人だ」となりました。私も書籍いくつか読んてみようかな。 文系出身できてるため、あまり数学には強くなかったりするので。
guest

0

大丈夫!俺もこの問題は理解できませんw

結構ひどい問題だと思いますよ。

以下、読んだときの私の理解度です。


それらの文字列を好きな順番で全て結合してできる文字列のうち、もっとも辞書順で小さいものを求めてください。

「小さい???」よし。一般的な辞書順じゃなくて、正しく「辞書式順序」として理解しろってことね。わかった!

なお、ある文字列 s=s1s2s3

...sn と t=t1t2t3...tm について、以下のどちらかを満たすとき、辞書順比較で s<t であるといいます。

・ある整数 i(1≦i≦min(n,m)) に関して、 1≦j<i を満たす任意の整数 j において sj=tj が成立し、かつ si<ti が成立する。

・任意の整数 i(1≦i≦min(n,m))に関して si=ti が成立し、かつ n<m が成立する。

ん??これだと「ab」と「ba」の順番つけられなくない??
そもそも si<ti の比較って、どうやって定義されてるんだ???

意味がわからん。とりあえず、普通の辞書順でソートするコードを適当に書いてみて、テスト通してみよう!


競技だったらこういったものは決め打ちしていくしかないので、繰り返し似たような問題解いて、自身の中のサンプル増やすしか無い気がします。

投稿2020/04/19 12:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/04/19 12:53

顧客との要件定義だったら、食らいついて離さない箇所ですけどねw
omologic

2020/04/19 13:05

自分以外にも分かりづらいと感じている人がいて少し安心しました^^; プログラマーの皆さんはこんなものを普通に理解しているのかと思うと、少し絶望を感じておりました。 でも現場(顧客との要件定義)では、しっかり確認しなければいけないという点についても指摘いただき、ありがとうございます。未知の世界なので、大変助かります!
退会済みユーザー

退会済みユーザー

2020/04/19 13:13

> 自分以外にも分かりづらいと感じている人がいて少し安心しました^^; 理解できていないっていうより、「必要な定義できてないじゃん」って感じです。
omologic

2020/04/19 13:44

なるほど、現役の人から見てもそういうもんなんですね。 たしかに文字自体の大小は定義されていないなとはうっすら思っていました。(文字コード順だろうと仮定しておりましたが)
guest

0

とにかくコードを書いて動かして、というのを繰り返し、経験を積むしかないです
ろくに言語の文法も覚えてない状態で読解力ってのは付くはずもないので、文法を身に染み付かせるしかないです

#覚えてる、だけじゃダメダメ

投稿2020/04/19 06:40

y_waiwai

総合スコア87800

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

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

omologic

2020/04/19 07:04

ご回答ありがとうございます。 私の説明が足りていませんでした。 AtcoderのA,Bクラスは無難に解ける程度には文法は身に付いています。 しかしながら、問題文をよく理解できないまま、入出力を見て、問題文を類推し、あとはトライアンドエラーで回答することが多いです。 またCクラス以上になるとからっきし駄目で、アルゴリズムの参考書に手を出しても内容がほとんど理解できず、わたしの文章読解力のなさがスキルのボトルネックになっているのではないかと思っています。 独特の文章なので、なにかお作法みたいなものがあるのかと思い、質問してみた次第です。 レベルが上がるとまったく駄目になり、今までのように数稽古でなんとかなるものではないように思え、どうすればよいのか分からずドツボにはまってしまっている状況です。
y_waiwai

2020/04/19 07:15

覚えてるだけじゃダメダメ 日本語の習得は、と聞かれてあなたならどう答える?というはなしといっしょで、これさえやっとけばOKというものなぞ存在しませんわな
ozwk

2020/04/19 07:34 編集

問題文に書かれている「日本語が」理解できないという話ですよね? (なお、ある文字列…の辺り)
y_waiwai

2020/04/19 07:27

問題文に書かれてるコードの話し、とよみましたがw
omologic

2020/04/19 09:14 編集

>ozwkさん そうです。恥ずかしながら問題文の日本語が理解できないという話です。
episteme

2020/04/19 07:56

> 問題文の日本語が理解できないという話です。 日本語で書かれた「数学的表現」が理解できないという話よね。
omologic

2020/04/19 08:27 編集

>epistemeさん 数学的表現については理解が曖昧で、結果として問題文自体の意味がよく分からないということになりますが、皆様の回答のおかげで数学的表現については理解しつつあります。 Sn や Tm のn,mがインデックスに相当するものだろうとかはなんとなく理解しておりましたが、長さの揃えられた文字列の比較のはずが、 s<tの説明では、なぜか長さの違う文字列を前提にしているため、混乱しておりました。 Sとs、Nとnがそれぞれまったく別物ということを理解し、あくまで条件の説明であり、SとNそのものの説明とは異なるということを知り、なんとなく理解が進みつつあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問