Rubyで組合せを計算する方法を現役エンジニアが解説【初心者向け】

初心者向けにRubyで組合せを計算する方法を現役エンジニアが解説しています。順序なしで重複なしの組合せを求めるにはcombinationメソッドを使います。順序ありや重複を許すメソッドもありますが、組合せの数が指数関数的に増加するので注意が必要です。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Rubyで組合せを計算する方法について解説します。Rubyについてそもそもよく分からないという方は、Rubyとは何なのか解説した記事をまずご覧ください。

 

なお本記事は、TechAcademyのWebアプリケーションオンラインブートキャンプの内容をもとに紹介しています。

田島悠介

今回は、Rubyに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Rubyで組合せを計算する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

Rubyのcombinationメソッドとは

combinationメソッドとは、配列からn個を選択した時の組み合わせを得ることができるメソッドです。組み合わせは、順序なし・重複無しで返されます。

ブロック処理と一緒に用いることができ、組み合わせの数だけブロックを実行します。組み合わせの計算が楽になるので、ぜひマスターしましょう。

Rubyで組合せを計算する方法

組み合わせを計算するには、配列に対してcombinationと続けることで使用します。

()の中に引数を入れ、今回のように3を渡すと1~4の4つの数字から3つ選んだ場合の組み合わせを得ることができます。

ブロック引数の中には、1通りの組み合わせが入ります。

numbers = [1,2,3,4]
numbers.combination(3){|a,b,c|
    printf("[%d %d %d]\n",a,b,c)
}

 

[PR] Rubyのプログラミングで挫折しない学習方法を動画で公開中

実際に書いてみよう

それでは実際に書いてみましょう。

# 配列を宣言する
numbers = [1,2,3,4]
# combinationで組み合わせを得る。今回は4C3で4通り得られる
numbers.combination(3){|a,b,c|
    printf("[%d %d %d]\n",a,b,c)
}

実行結果は以下の通りです。

[1 2 3]
[1 2 4]
[1 3 4]
[2 3 4]

ブロックを省略する場合、Enumeratorオブジェクトが返り値となります。以下のようにコーディングしてみましょう。

 

# 配列を宣言する
flavors = ["チョコ","抹茶","バニラ","いちご"]
# combinationで組み合わせを得る。今回は4C2で6通り得られる
# ブロックを使用しない場合、enumeratorオブジェクトが返される
double = flavors.combination(2)
# 配列として出力
p double.to_a

# mapメソッドでflavorsの組み合わせをくっつける
double = double.map{|flavor|
    flavor.join("+")
}.join(" ")

# 出力
puts double

 

実行結果は以下の通りです。

[["チョコ", "抹茶"], ["チョコ", "バニラ"], ["チョコ", "いちご"], ["抹茶", "バニラ"], ["抹茶", "いちご"], ["バニラ", "いちご"]]
チョコ+抹茶 チョコ+バニラ チョコ+いちご 抹茶+バニラ 抹茶+いちご バニラ+いちご

 

以上で解説は終わりです。組み合わせが使えると、ちょっとした計算やツール作成に役立ちます。ぜひマスターしてみてください。

 

筆者プロフィール

メンター金成さん

フリーランスエンジニア。
Railsの案件を中心に、様々なアプリケーションを開発してます。

使える言語は、ruby python go 。最近はgoにハマってます。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

TechAcademyでは初心者でも最短4週間でエンジニアになれるRuby on Railsオンラインブートキャンプを開催しています。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルWebサービスを開発することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。