Header
2020-03-08
2020-09-07

paiza(パイザ)Cランク練習問題|検索履歴のRubyサンプルコードと解説

2020 03 08 4ef1c900dbeada5e958cd

paiza(パイザ)Cランク相当の練習問題の解説とサンプルコードの|検索履歴についてRubyサンプルコードと解説を記載します。

この問題は回答提出するとpaiza公式でRubyのサンプルコードが用意されています。

問題の要件と概要は以下から

検索履歴

以下から公式の抜粋を元にプログラム化する際の思考の流れとサンプルコードを記載します

Cランク問題の検索履歴の入出力値

入力値

N
W_1
W_2
...
W_N

1 行目には検索ワードの数を表す整数 N が与えられます。
続く N 行では検索ワード W_i が与えられます。
続く N 行のうちの i 行目 (1 ≦ i ≦ N) には、検索ワード W_i が与えられます。検索ワード W_i は小文字のアルファベット a ~ z のみからなる文字列です。

期待する出力

検索ワードを N 個入力した後の検索履歴を出力してください。
出力の最後に改行を入れ、余計な文字、空行を含んではいけません。

入出力例(公式から抜粋)

入力例1
5
book
candy
apple
book
candy

出力例1
candy
book
apple

問題をプログラム化する際の考え方

N (数字の総数)と記載されているので、処理を行う回数を指定する事が分かります。

1 行目には検索ワードの数を表す整数 N が与えられます。

その為、プログラムとしては入力した回数だけ処理を行うということが分かります。

そして、問題の要件から以下が分かります。

期待する出力

検索ワード W が以前に入力されたことがある場合:
履歴中の W を削除する。
履歴の先頭に W を追加する。
検索ワード W が以前に入力されたことがない場合:
履歴の先頭に W を追加する。

期待する出力からプログラム可する際に以下が判断できます

1:1つ1つ文字が入力される

2:入力値の重複チェックを行う

3:重複する場合は、重複する過去の値を削除する

4:重複チェック後の処理は入力値が重複してもしていなくても 先頭に W を追加するという処理は同じ   

入力した値を一時的に保存する何かが必要になります。

この何かはプログラム的にはハッシュか配列なので、 今回は配列を利用します。

プログラム化する際にRuby的な処理を考える

1:繰り返す処理回数を取得する

2:入力値を格納する空の配列を生成

3:指定回数処理を行う

4:回数処理の中で、文字列を取得する

5:重複した値か判断する

6:重複する場合は、過去の重複値を削除する

7:配列へ入力した重複値を配列の先頭に追加

8:重複しない値の場合は値を配列の先頭に追加

paizaCランク問題検索履歴のRubyサンプルコード

プログラム化する際に考えた事をRubyに当てはめます。

counts = gets.to_i
strings = []
counts.times do |i|
  string = gets.to_s.strip.downcase.chomp
  if strings.include?(string)
    strings.delete(string)
    strings << string
  else
    strings << string
  end
end

(strings.length-1).downto(0) do |i|
  puts strings[i]
end

rubyでterminal上から値を取得するのはgetsメソッドです。

今回はgetsで取得した値は数字なので、to_iメソッドで

数字化します。

その後stringsという空配列を生成します。

その後times メソッドで、指定回数繰り返し処理を行うようにします。

要件として英語を小文字で取得する必要があるので、 以下で値をstringで取得し、downcaseで文字列を小文字化します。

stripとchompは空白や改行コードの除去です

string = gets.to_s.strip.downcase.chomp

で値を再度取得します。

詳細は以下

RubyのStringクラスとよく使うメソッド

その後配列に入力値が存在する場合は、過去の重複値を削除します

その後入力値を先頭に追加します それが以下です

    strings.delete(string)
    strings << string

条件に該当しない場合は配列へ値を追加します。

その後、配列の値を逆順で表示する必要があるので、 繰り返し処理で配列の値を表示します。

それが以下です。

(strings.length-1).downto(0) do |i|
  puts strings[i]
end

Cランク問題の検索履歴を終えて思ったこと

paiza(パイザ)Cランク練習問題|5以上の整数の合計のRubyサンプルコードと解説の発展系だと思います。

今回は

1:文字列の加工

2:値の格納と表示設定を別々に行う

事が必要なので、値のデータ型(数字か文字列)の意識と表示する際の処理加工がポイントになります。

Javaやgoなどは変数のデータ型を指定する必要がありますが Rubyはそれを意識する事が少ない為、加工する際の値をどうするかを意識する必要があります。

関連問題

paizaのスキルチェックの難易度|各ランクの特徴・ランクアップのコツを現役エンジニアが解説

paiza(パイザ)Bランク練習問題|日別訪問者数の最大平均区間のRubyサンプルコードと解説

paiza(パイザ)Bランク練習問題|神経衰弱のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|5以上の整数の合計のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|宝くじのRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|野球の審判のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|アルファベット探しのRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|単語のカウントのRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|野球の審判のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|【競技7】奇数大好き山田さんのRubyサンプルコードと解説

Rubyで以下のような練習問題を用意しているので、回答できなかった方はまずは以下練習問題を試してみてください

Rubyの練習問題:配列編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:文字列編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:ハッシュ編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:繰り返し処理編|初心者・独学者向け入門コンテンツ

[Rubyの資格試験|Ruby技術者認定試験 (Silver version 2.1)の解説と対策概要

Rubyの練習問題:ファイル操作編|初心者・独学者向け入門コンテンツ

Rubyでバブルソートを行う

Rubyで二分探索(バイナリサーチ)を行う

paiza(パイザ)に慣れるとAtCoderアットコーダーもお勧めです

その他関連記事

未経験からエンジニアに転職した人間が考える、今からエンジニアに就職する方法

プログラミングポートフォリオとは|未経験からエンジニアに就職した人間が解説

エンジニア転職の最終面接で落ちる理由

客先常駐エンジニアを脱出したいならセールスエンジニアはお勧め

職歴を作るためにSESに就職して、Web系エンジニアへ転職は可能か

業務SESやSIからWeb系エンジニア転職の志望企業の見つけ方

独学プログラミングの勉強手順|未経験からエンジニアに転職した人間が解説

あなたにお勧めの記事
前の記事
次の記事