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

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

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

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

Q&A

解決済

1回答

1970閲覧

Ruby の配列の扱いで困りました。

krppppp

総合スコア13

Ruby

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

0グッド

0クリップ

投稿2018/01/09 10:09

paizaさんのアルゴリズム問題を解いている最中、回答へ向けての道のりで詰まってしまったのでアドバイスを頂けましたらとおもいます。
尚、ここに掲載する問題は、公式サイトの練習問題として公開されている物なのでスキルチェック用の問題を流出させる目的、意図ではございません。

#問題 
練習問題 長テーブルのうなぎ屋 (paizaランク B 相当)

うなぎ屋にはとても大きい長テーブルがあり、テーブルの周りにn個の座席が配置されています。
座席には、時計回りに1, 2, …, nと番号が振られています。
座席はテーブルの周りに配置されているので、座席番号nの座席と1の座席は隣接しています。

今、m個のグループの人達が座席に順番に座りに来ます。i番目(1≦i≦m)のグループの人数をa_i人とします。
彼らは、長テーブルに並んだ座席の内、ある連続するa_i個の座席に一斉に座ろうとします。

ただしお客さんは江戸っ子なので、それら座席のうち、いずれか一つでも既に先客に座られている座席があった場合、
一人も座らずにグループ全員で怒って帰ってしまいます。江戸っ子は気が早いんでぃ。

入力では、i番目のグループが座ろうとする連続した座席の位置は、整数b_iにより指定されます。
i番目のグループは、座席番号b_iの座席を始点として、そこから時計回りにa_i個分の座席に座ろうとします。

最後のグループが座りに来た後、無事に長テーブルの座席に着席出来ている人数を出力するプログラムを作成してください。

##入力される値
入力はm+1行から成ります。
1行目にはn(座席数)とm(グループ数)が半角スペース区切りで入力されます。
i+1行目(1≦i≦m)には2個の整数a_i(グループの人数)とb_i(着席開始座席番号)が半角スペース区切りで入力されます。

#回答コード

ruby

1input_lines = gets.split(" ").map(&:to_i) 2chairs=Array.new(input_lines[0] , false) #席数 falseデフォで座っている席をtrue 3group = input_lines[1] #グループ数 4 5group.times do 6 input = gets.split(" ").map(&:to_i) 7 f_chair=input[1]-1 #組み毎の先頭が座る席番 インデックスのため-1 8 cnt=input[0] #人数 9 if f_chair + cnt <= chairs.size then #座る席が0をまたぐか 10 next if chairs[f_chair , cnt].any? #座ろうとした席が一つでも埋まっていれば退出してしまう 11 chairs[f_chair,cnt].map{|c| c = true} <--ここに問題あり 12 else 13 next if chairs[0 , (f_chair+cnt)%chairs.size].each{|c|c = true} || chairs[f_chair..-1].each{|c|c = true} 14 chairs[0 , (f_chair+cnt)%chairs.size].map{|c| c = true} 15  chairs[f_chair..-1].map{|c| c = true} 16 17 end 18end 19 20#答としてtrueの数を出力 21

#説明
回答のながれとして
0をまたぐ座り方か否かでまず分岐して、そのあとそれぞれ一席でも埋まっていれば出ていてしまうようにしました。
うまく動作しないのが上述した部分で、着席番にtrueをいれたいのですがtrueになりません。(mapメソッドになってますがeachもためしました。)

ruby

1実際の問題の標準入力例) 26 3 32 3 46 1 55 2 6. 7. 8. 9chairs[f_chair,cnt].map{|c| print c = true} 10print chairs 11 12> 13true 14true 15true 16[false, false, false, false, false, false] 17 18true 19[false, false, false, false, false, false] 20 21true 22true 23[false, false, false, false, false, false]

と、trueの代入を行った直後にデバックとして出力結果を試みながら行っていたのですがchairsの値が変化してくれません。
なぜなのかさっぱりなので原因を教えてほしいです。
またこの問題に対するアルゴリズムの考え方はどうかご意見をお聞かせください。
こんな考えもあるよ、短くかけるよ、なども大歓迎です。

駄文ですがよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

その問題を解くアルゴリズムの実装として正しいかはさておき、

ある配列 ary のインデクス n の位置からm 個を 値 x で上書きする。

ためには、以下のように書くとよいです。(もしかしたら他のより良い書き方があるかもしれませんが)

ruby

1ary[n, m] = Array.new(m, x)

参考: Rubyリファレンス:[]= (Array)

以下は、上記の例です。

ruby

1ary = Array.new(10) { |i| i } 2 3p ary # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 4 5# インデクス 3 の位置から、4 個の要素を 999 にする。 6ary[3, 4] = Array.new(4, 999) 7 8p ary # => [0, 1, 2, 999, 999, 999, 999, 7, 8, 9]

上記にそって、ご質問にある

ruby

1chairs[f_chair,cnt].map{|c| c = true} <--ここに問題あり

の部分を

ruby

1chairs[f_chair,cnt] = Array.new(cnt, true)

とすれば、(実際に動かして試してはいませんが)とりあえず、

着席番にtrueをいれたいのですがtrueになりません。

という問題は解決するかと思います。

以上参考になれば幸いです。

投稿2018/01/09 10:58

編集2018/01/09 11:11
jun68ykt

総合スコア9058

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

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

krppppp

2018/01/09 11:51

迅速な回答ありがとうございます。 なるほど勉強になりました。 参考ページを読み進めたところ、この質問に至るまでに付随してつまづいた部分までも補完することが出来ました。 また、練習問題自体も回答することが出来ました。 ありがとうございました。
jun68ykt

2018/01/09 14:48

解決したようで、よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問