Rubyの問題:同じ誕生日を持つ学生の人数を数えるアルゴリズム

このQ&Aのポイント
  • 同じ年に生まれたnの学生がいる。同じ誕生日を持つ学生の人数を数えるアルゴリズム1とは、学生の誕生日を1人ずつ取り出し、配列bのすべての中身と比較して同じ誕生日の学生がいるかどうかを調べる方法です。
  • アルゴリズム2は、配列bを小さい順に並べ換えてから連続する同じ値の区間の長さを数える方法です。
  • アルゴリズム3では、大きさ365の配列cを作り、学生の誕生日を1人ずつ取り出して該当する日付の人数をcに記録し、最後にcの値のうち2以上のものの和を求めます。
回答を見る
  • ベストアンサー

rubyの問題です。 コードを教えてください

同じ年に生まれたnの学生がいる。こ の中には,同じ誕生日を持つ学生と,そうでない学生がいる。前者が何 人いるか数えるアルゴリズムをいくつか考え,その計算量を考えよ。簡 単のために,誕生日は1月1日からの日数(つまり0から364の整数) で表わすことにする。また,学生の誕生日は大きさ冊の配列bに入って いるが,その順序はデタラメだとする。 アルゴリズム1:同じ誕生日を持つ学生の人数を変数mで表わすこと にして,最初は、0にしておく,学生の誕生日を1人ずつとり出 し,配列bのすべての中身と比較して同じ誕生日の学生がいる かどうかを調べ,1人でも同じ誕生日の者がいた場合はmを1 増やす。これをすべての学生について行う。 アルゴリズム2:同じ誕生日を持つ学生の人数を変数皿で表わすこと にして,最初は0にしておく。配列bを併合整列法によって小さ い順に並べる。並べ換えた配列を先頭から順に調べてゆき,同 じ値が連続する区間の長さkを数える。kが2以上の場合の区 間があった場合は,mをkだけ増やす。これを配列の最後まで 行う。 アルゴリズム3:日付ごとの人数を数えるために,大きさ365の配列 cを作り,中身をすべてOにしておく。学生の誕生日dを1人 ずつとり出し,その日付の人数c[d]を1増やす。これをすべて の学生について行う。最後に,cを先頭から調べて2以上になっ ている値の和を求める。

  • Ruby
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#158634
noname#158634
回答No.1

丸投げするなよっていうのはおいておいて。 そんな面倒なことしなくてもcountメソッドでできる。 http://ref.xaio.jp/ruby/classes/array/count

bumpruby
質問者

お礼

こんな便利なメソッドがあるんですね まあでもアルゴリズムから計算量を比較しなきゃならないので・・・ とりあえず自己解決しました。 ありがとうございました。

関連するQ&A

  • 問題がとけません

    以下の問題が解けません。 わかる方、教えていただけないでしょうか? ・問題 int型の変数i,j,k,m,n,double型の変数a,bに,下に示す式の結果を代入し結果を i = ... a = ... j = ... b = ... k = ... m = ... n = ... と出力せよ(int型の変数は%d,double型の変数は%lfで変換すること)。プログラムコードの下にコメントとして,各演算結果がそのようになる理由を書き入れて提出せよ。とくにk,m,nに対応する式は,ある特定の意味を持っている。それぞれどのような意味を持つ式であるかということに言及すること。 i = 11/17*8 + 27/13; a = 11/17*8 + 27/13; j = 11.0/17*8 + 27/13; b = 11.0/17*8 + 27/13; k = 281 - 281/47*47; m = 263.0/47+0.5; n = 293.0/47+0.5; 

  • 背理法の問題

    問題が・・・ a,b,cは整数とし、a^2,b^2,c^2=c^2とする。a,bのうち、少なくともひとつは3の倍数であることを証明せよ~。 というものですが、解答の流れを見ていて また疑問が・・・ 「解答」 a,bはともに3の倍数でないと仮定すると。 aとbは a=3m±1,b=3m±1(m,nは整数)とあらわせる。 ☆ここなんですが、なんで±の部分が1になるのかが  わかりません。2とかはまずいですが  4とか5じゃだめなんでしょうか。 a^2+b^2=(3m±1)^2+(3n±1)^2 =3(3m^2+3n^2±2m±2n)+2 ちなみに複合同順ですね。 3m^2+3n^2±2m±2nは整数だから a^2+b^2を3で割ったあまりは2 一方c=3k,3k±1とあらわせて・・ ☆ここのcではなんか二種類にもあらわせている。  またわからんのです。 解答にはあとちょっと続きありますが ここの二つのポイント教えてもらえれば 十分です。アドバイスまってます・・・・ (^^_且~~~~

  • プログラミングの問題で分からないものがあります。

    プログラミングの問題で分からないものがあります。 m人のグループに同じ誕生日の人が二人以上いる確率Pはどのような式で表されるか? ただし、誕生日は1年365年に渡ってランダムに分布すると仮定する。(まず、同じ誕生日の人が一人もいない確率を考えるとよい。) グループ人数mの入力に対しPを計算するプログラムを作りなさい。 Pが初めて1/2を超えるmの値を求めよ。(そのようなmの値を求めるプログラムを作りなさい。) 回答お願いします。

  • 配列変数のアドレス

    C言語で、配列を宣言した場合、 char a[] = "hoge"; 変数aは初期化された配列の先頭番地を指しているのですが、この時、 変数aの中身も変数aのアドレス(&a)ともに上記の配列の先頭番地になっているようなのですが、 これによって、配列の変数aは読み取り専用で、書き換えられないということにしていると思っていいのでしょうか? ちなみに、 char *p = "fuga"; とした場合は、pと&pのアドレスは異なって、pの中身は書き換えられます。

  • Cプログラミングの関数電卓のアルゴリズムについてですが、

    Cプログラミングの関数電卓のアルゴリズムについてですが、 標準入力からの文字列式を、トークンに区切り、先頭から配列型スタックに格納して、計算を行う処理を考えていて、 a-b-cという処理のアルゴリズムに困っています。 どういった解決策があるのか教えて頂けませんか?? お願いします!! フローチャートを書くほどの事でも無いと思うので、僕が考えていたアルゴリズムを、文で記載しますが、できれば、このアルゴリズムからどうすれば解決できるかを考えて頂けたらとても助かります!! 1. 別のスタックを用意して、元々のをstack1,コピー用をstack2とし、stack1のトップからstack2に格納。(スタックの構造は二次元文字型配列) この場合、cからstack2に格納される。 2. 演算子を見つけると、その前後の数字をその演算子によって処理。 この場合なら、c-bという処理。 3. 計算結果を、cが格納されていた、演算子の前に格納。 4.引き続き、この操作を繰り返す。 これを考えてたんですが、実行すると、(c-b)-aという式になり、違う答えが出てしまいます。加算ならば影響はでません。 きちんと(-c-b)+a の処理をさせるにはどうしたら良いかがわからないです。 お願いします!! ※返事が多少遅れるかもしれませんが、すみません!!

  • 先頭アドレスとは何ですか?

    Cの勉強をするため、Cの勉強用のホームページを読んでいたのですが その中に 「“int a[10];”というふうに配列を宣言した場合、配列名“a”はその配列の先頭アドレスになります」 という一文がありました。これが理解できません。 「アドレス」はメモリ内の、変数が記憶されている場所のことですよね。 先頭アドレスの「先頭」とは一体何に対して「先頭」なのでしょうか。 「一番前」という意味でしょうか。なら何の中で一番前なのでしょう? さらにそのホームページでは 「配列名“a”を式の中に書くと、普通は配列の先頭要素を指すポインタになります」 と言いなおしていましたが、これもよくわかりません。 「先頭要素」とは? 一体何に対する先頭なのでしょう?要素の先頭とは何を指すのかがいまいちピンときません。 初心者にありがちなお恥ずかしい質問ではありますが、ご教授いただければ幸いです。

  • Excelで住所録。コード順をあいうえお順にしたい。

    住所録を作りました。A列にコードB列に顧客名C列に郵便番号以下住所、電話番号、誕生日と続きます。今、コード順は、1から200まであります。コード順はこのままで別シートに顧客名(あいうえお順)と誕生日順を作りたいと考えています。教えてください。誕生日は昭和26年2月1日なら260201としています。

  • 青チャートp424の149の数列の問題です

    a_{n}=8n-2 , b_{n}=6n+2 に共通して現れる数を小さい順に並べた数列c_{n}を求めよ 解答;a_{l}=b_{m}とすると、8(n-2)+14=6(n-2)+14から    4(l-2)=3(m-2), l≧2, m≧2 4と3は互いに素より、kを自然数として    l-2=3(k-1),m-2=4(k-1)    (後は省略)  ここでなぜkはk-1にするのでしょうか。あとl≧2,m≧2の理由もわかりません。ご指導のほど宜しくお願いします。

  • 入り口が1つから3つになったという問題でわからない問題があります。

    数学の文章問題をやっているのですが、 解説を見ても私の考え方から遠くてきっと忘れてしまうので、 なんとか自分流を見つけて解きたいのですが、 アドバイスがいただきたく質問させていただきます。 <問題> ある会場で入場を開始する前に大勢の人が1列にならんでおり、毎分一定の人数が列の最後尾に並び続けている。この列の人々が会場に入場を開始してから列がなくなるまでに要する時間は、入り口が1つのとき2時間24分で、2つのときは32分であるとき、入り口が3つのとき入場を開始してから列がなくなるまでに要する時間は何分か?ただし各入り口から1分間あたり入場する人数は同じとする。 このような問題です。 ここで私は入場を開始するまでに並んでいた人数をn人として、 1分あたりm人列に増えていくとしました。 これで入り口1つの場合は n+144×mがすべて入場するまでの人数。 入り口2つの場合は n+32×mがすべて入場するまでの人数。 ここで悩んで1つの入り口から1分で入場できる人数をc人として n+144m=144c n+32m=32×2cとなります。 これが解けそうなのでやってみると m=5/7cとなりました。 ここでちょっとわからなくなって 7m=5cにできるので、 mは7の倍数でcは5の倍数になります。 とやってみたのですが、 何がなんだかわからなくなってしまいました(^^;) 頭がこんがらがってしまいました。。。 どうやって解けばわかりやすいでしょうか?

  • N桁の数字を順に表示したい

    例えば (1~9)までの数字を4つの変数(配列の1要素ずつでもいい) に分けて格納して、各変数の数字がダブらないようした 4桁の数字を順に表示するときって if( $a!=$b and $a!=$c and $a!=$d and $b!=$c and $b!=$d and $c!=$d ){ echo $a.$b.$c.$d."<br>" } すればいいと思うのですけど 数が多くなるとものすごく大変なので もっといい方法があるのではないかと思うのですが? ありますでしょうか?

    • ベストアンサー
    • PHP