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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

695閲覧

rubyの問題解説をお願いしたいです。

mnmn13

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2023/03/24 13:08

実現したいこと

あなたは、ある高級料亭を経営しています。この料亭は特殊で、毎日 1 人にのみ料理を提供しています。
あなたは、リピート率を上げるため、しばらく料亭に来ていない客に向けて割引キャンペーンを実施することにしました。具体的には、直近 M 日間に来店したものの、直近 N 日間に来店していない客に割引を行うこととしました。

直近 M 日間に来店した客の名前のリストが与えられるので、キャンペーンの対象となる客が何人いるかを出力するプログラムを作成してください。

入力例 1 では、直近 6 日間に来店した客のうち、直近 3 日間に来店していない客がキャンペーンの対象となります。この場合、tom と john がキャンペーンの対象となるので、2 と出力します。

入力は以下のフォーマットで与えられます。

N M
S_1
S_2
...
S_M
・1 行目には、来店するとキャンペーンの対象から外れる期間の日数を表す整数 N、キャンペーンの対象となる期間の日数を表す整数 M がこの順で半角スペース区切りで与えられます。
・続く M 行のうちの i 行目 (1 ≦ i ≦ M) には、直近 M 日間のうち i 番目に来店した客の名前を表す文字列 S_i が与えられます。
・入力は合計で 1 + M 行となり、入力値最終行の末尾に改行が 1 つ入ります。

それぞれの値は文字列で標準入力から渡されます
期待する出力
キャンペーンの対象となる客の人数を表す整数を出力してください。
出力最終行の末尾に改行を入れ、余計な文字、空行を含んではいけません。

以下の条件をみたします。

・1 ≦ N < M ≦ 100
・S_i (1 ≦ i ≦ M) は英字小文字のみからなる
・1 ≦ (S_i の長さ) ≦ 10

ヒントでも結構なので回答お待ちしております。

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

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

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

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

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

guest

回答3

0

ヒントでも結構なので

  1. リストに登場する客のそれぞれをキーとするハッシュを作る。
  2. 直近N日に来ている客について同様にハッシュを作る。
  3. 前者のハッシュにあって後者のハッシュにないキーを数える。

投稿2023/03/24 17:30

KojiDoi

総合スコア13676

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

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

0

1行を読んでNとMがわかったら、N行分は読んだ人名をハッシュにでも入れるだけ。それが終わってからM行までは、ハッシュに入れるまえに、人名がハッシュになければカウンタを+1するようにでもすれば。

投稿2023/03/24 15:24

matukeso

総合スコア1608

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

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

0

ベストアンサー

追記

先頭からM-N人の一覧を作って、そこから残りのN人を削除するだけでしょう。残った人数をカウント。
一覧を作るのはArrayでもいいし、Hashでもいいし、Setクラスでもいい。
簡単なのは、Arrayで集合演算(差集合)でしょうか。
listに全員のリストがあるとして、list[0...(M-N)].uniq - list[-N..].uniqかな。


下記は最初の回答ですが、間違いです。コメントを参照。


これは、おそらく問題文の書き誤りですね。
文字通りだとすると、誰がいつ来たかわからないので、答えようが無いです。

おそらく、

・続く M 行のうちの i 行目 (1 ≦ i ≦ M) には、直近 M 日間のうち i 番目に来店した客の名前を表す文字列 S_i が与えられます。

は、

・続く M 行のうちの i 行目 (1 ≦ i ≦ M) には、直近 M 日間のうち i 日目に来店した客の名前が空白区切りで並んだ文字列 S_i が与えられます。

のつもりで、問題を考えたのでしょうが、書いている内にそれを忘れて書き誤ってしまったのでしょうね。
上記の文にさらに追加して、古い方の日から並んでいるのか、新しい方の日から並んでいるのかを書かないと回答不能です。

投稿2023/03/24 13:30

編集2023/03/24 18:40
otn

総合スコア84864

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

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

mnmn13

2023/03/24 14:10

失礼いたしました。 古い日にちから並んでおります。
otn

2023/03/24 14:17

失礼しました。 > 毎日 1 人にのみ料理を提供しています。 を読み落としてました。 私の回答は間違っていますが、そうすると、問題文に不明な点は無いと思うのですが。 何が不明なのでしょうか?
mnmn13

2023/03/24 14:40

ご返信ありがとうございます。 失礼しました。この問題を解く上での考え方がわかりません。
otn

2023/03/24 18:35

質問には、「問題解説をお願いしたいです。」と書いてありますが、それは間違いで、 「問題の解き方を教えて欲しい」ということでしたか。 質問が違っていると適切な回答が出来ません。 追記しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問