paiza times

paizaがお届けする、テック・キャリア・マネジメント領域における「今必要な情報」を届けるWebメディア

logo

paizaがお届けする、テック・キャリア・マネジメント領域の「今必要な情報」を届けるWebメディア

初心者が少し難易度の高いプログラミング問題に挑戦するための手引き【Ruby】


プログラミングゲーム『コードクロニクル』のガチャで集められるキャラクター。目指せコンプリート!

f:id:paiza:20180910132940p:plainこんにちは。倉内です。

先日paizaが公開したプログラミング学習ゲーム『コードクロニクル』では、クエストを有利に進めるためのスキルを持つキャラクターをガチャで引くことができます。

現在指定のスキルチェックコラボ問題(プログラミング問題)に正解するとガチャを回せるアイテムがゲットできるキャンペーンを実施しています。本日公開されたコラボ問題は、先週出題された問題より少し難易度が上がっていますので、今回は問題を解くためのアプローチをRubyで解説します

また、先週と今週の問題両方に正解していただくとAmazonギフト券が当たるキャンペーンの抽選対象となります。ぜひ期間中に挑戦してみてくださいね。


 

スキルチェックコラボ問題に挑戦しよう

スキルチェックとは

paizaではプログラミング問題を解いて、プログラミングスキルをS・A・B・C・D・Eの6段階にランクづけするスキルチェックというサービスを提供しています。

Webブラウザ上でコードを書いて提出し、実行速度や解答時間も加味してリアルタイムで採点しスコアを出します。その点数によって上位のランクへアップするか、とどまるかの判定がされます。(ランクが下がることはありません)

ランクを取得するとpaizaの就職・転職サービスで書類選考なしに求人へ応募できますが、ご自身のプログラミングスキルを測る腕試し感覚で利用してくださる方も多いです。

スキルチェックについて詳しくはこちら
paizaのスキルチェック
 

ランクによる難易度の違い

先週出題された1問目のスキルチェックコラボ問題はDランクでした。Dランク問題はプログラミング言語の基礎文法が習得できていれば解くことができます。

今週はひとつ上のランクのCランク問題です。

CランクとDランクには以下のような違いがあります。なお、問題内容は計算処理、文字列処理、パズルを解くものなどさまざまなので当てはまらないものもあります。

Dランク問題:
  • 解答にかかる時間は平均で3~10分程度
  • 問題文を一読して内容が理解でき、プログラムで何を実現すればいいか分かる
  • 文字列や数値の取得・出力、四則演算・条件文・ループ文を使いこなせれば解くことができる。条件分岐がある場合、単純な条件で2、3の分岐で済む
Cランク問題:
  • 解答にかかる時間は15~30分程度
  • 問題文を一読すれば内容の理解はできるが、実装方針を少し考える必要がある
  • 四則演算・条件文・ループ文・配列、数値や文字列の検索や比較などを複数組み合わせて解く必要がある
  • 多重ループや複雑な条件分岐が要求される問題もあり、境界値に気をつけないとIndexエラーの発生や通らないテストケースが出てくる

これらを踏まえた上で、プログラミング初心者の方がどのようにCランク問題を解くとよいかを考えていきましょう。

コラボ問題(Cランク)を解くためのステップ

スキルチェックの本問題は求人への応募と関係しますので、解答コードの公開や解説は禁止させていただいています。

そのためここからはスキルチェックの練習用に公開している「レベルアップ問題集」を活用して、Cランク問題を解く道筋を解説していきます。

今回使うのはその中の「Bランクレベルアップセット」の問題です。

これはDランク、Cランクの問題を順番に解いていくことで最終的にBランク問題を解けるようになるための問題集なのですが、DランクからCランクに挑戦する際にも有用です。

Cランク問題を解くためには、問題文で求められている内容をひとつひとつ分解して、Dランク問題レベルの処理に落として攻略していくからです。

ちなみにこの記事を書くにあたって初めてRubyに触れたので、多少冗長なコードの書き方をしている部分があるかもしれません。レベルアップ問題集では、テストケースや一部解答例も参照することができますので、合わせてご確認いただければと思います。

最終目的とするCランク相当問題を確認する

「Bランクレベルアップセット」はいくつか問題のセットがありますが、今回はこのセットを解くことにします。(FINAL問題以外はチケットが消費されるためご注意ください)

Cランク相当の問題は「文字列の重複カウント」です。

1行目で文字列 s、2行目で文字列 t が入力されます。
s が t の中で何回出現するかカウントして出力してください。


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

s
t


期待する出力:
出現回数を1行で出力してください。
最後は改行し、余計な文字、空行を含んではいけません。


条件:
すべてのテストケースにおいて、以下の条件をみたします。

1 ≦ (文字列 s の長さ) ≦ 10,000
1 ≦ (文字列 t の長さ) ≦ 10,000
文字列 s, t は、半角アルファベットで構成された文字列

この問題を解くには

  • 標準入力でデータを受け取れる
  • 特定の文字列を先頭から順に検索する処理が書ける
  • 文字列の一致・不一致を判定する処理が書ける

ことが必要になります。

標準入力で値を受け取る

標準入力にはいくつかパターンがありますが、ここでは「1行のデータの入力」と「複数行のデータの入力」をマスターしましょう。

1行のデータの入力

問題セットの最初の問題、Dランク相当の「文字列の長さ」を解きます。

文字列が入力されるので、その長さを出力してください。


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

s


期待する出力:
文字列 s の長さ出力してください。

最後は改行し、余計な文字、空行を含んではいけません。


条件:
すべてのテストケースにおいて、以下の条件をみたします。

1 ≦ (文字列 s の長さ) ≦ 30
s は半角文字で構成された文字列

回答例は以下のとおりです。文字列の長さはlengthというメソッドを用いて取得することができます。

# 標準入力で与えられた文字列Sを取得する
S = gets

# 文字列Sの長さを出力する
puts S.length

 

N行のデータの入力

続いて複数行のデータを受け取る処理もよく使うので覚えておきましょう。レベルアップ問題集の中の「標準入力セット」から「N行のデータの入力」を解きます。

標準入力でN行それぞれで文字列が与えられるので、それらを入力して、順にそのままN行で出力してください。


入力される値:
1行目でNが与えられます。
続くN行の各行で文字列が与えられます。


期待する出力:
N行での出力


条件:
すべてのテストケースにおいて、以下の条件をみたします。

・1 <= N <= 10
・入力される各文字列は1文字以上100文字以下の文字列
・入力される各文字列の各文字は英小文字または大文字または数字または半角スペース

回答例は以下のとおりです。

# 与えられる文字列の個数N
N = gets.to_i

# N個の文字列を標準入力から受け取ってword_lineに格納して表示
for i in 1..N
word_line = gets
puts word_line
end

もう少し簡潔に書くこともできます。

# 与えられる文字列の個数N
N = gets.to_i

# N個の文字列を標準入力から受け取ってword_lineに格納して表示
word_line = readlines.map(&:chomp)
puts word_line

標準入力は、paizaラーニングの動画講座でも解説しています。標準入力がまだちょっと不安だという方は受講してみてください。

文字列を扱う処理

「Bランクレベルアップセット」に戻って、文字列の処理に慣れていきましょう。ここでは「1文字ずつ出力」と「文字列の n 文字目と n + 1 文字目」を解説します。(飛ばした問題も挑戦してみてください)

1文字ずつ出力

文字列が入力されるので、それらの文字を、1文字ずつ出力してください。


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

s


期待する出力:
文字列 s の各文字を、1文字ずつ出力してください。
1文字出力ごとに改行してください。


条件:
すべてのテストケースにおいて、以下の条件を満たします。

1 ≦ (文字列 s の長さ) ≦ 30
s は半角英数字で構成された文字列

回答例は以下のとおりです。splitメソッドを使って1文字ずつ取得するという処理を書きました。

# 標準入力で与えられた文字列Sを1文字ずつ取得する
S = gets.split('')

# 文字列Sを1文字ずつ出力する
puts S

 

文字列の n 文字目と n + 1 文字目

文字列 s が入力されるので、n 文字目と n + 1 文字目を出力してください。 n + 1 文字目がない場合は何も出力しないでください。


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

n
s


期待する出力:
n 文字目と n + 1 文字目を半角スペース区切りで出力してください。


条件:
すべてのテストケースにおいて、以下の条件をみたします。

1 ≦ (文字列 s の長さ) ≦ 10,000
1 ≦ n ≦ 10,000
文字列sは、半角アルファベットで構成された文字列

回答例は以下のとおりです。

# n文字目として与えられる数値を取得する
n = gets.chomp.to_i

# 文字列を取得する
S = gets.chomp

# n+1文字目があるときだけ出力する
if n < S.length then
    puts S[n - 1] + " " + S[n]
end

文字列は先頭の文字から0番目、1番目…と数えるため、n - 1文字目が先頭の文字となります。また、「n + 1 文字目がない場合は何も出力しない」という条件があることを忘れずにif文で処理してください。

文字の一致

最後に「スキルチェック見本問題」から、「文字の一致」という文字列検索の問題も解いておきましょう。

2 つの文字列 a, b が入力されます。文字列が一致していれば "OK" 、異なっていれば "NG" と出力してください。


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

a
b

・1 行目に文字列 a
・2 行目に文字列 b


期待する出力:
文字列 a と文字列 b が一致していれば "OK" 、異なっていれば "NG" と出力してください。


条件:
すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ 文字列 a の長さ ≦ 100
・1 ≦ 文字列 b の長さ ≦ 100

回答例は以下のとおりです。

# 標準入力から比較する文字列2つを受け取る
word_a = gets
word_b = gets

# word_aとword_bの一致・不一致を調べる
if word_a == word_b then
    puts "OK"
else
    puts "NG"
end

 

Cランク相当問題「文字列の重複カウント」を解く

ここまでDランク相当の問題をいくつか解いてきたので、いよいよ最初に取り上げたCランク相当の問題を解いていきましょう。

文字列の検索ですが、Dランク問題と違って難しい点は「不特定の文字数が含まれるかを文字列の先頭から順に一致・不一致を見ていかなければならない」という点だと思います。

# 検索したい文字列をpatternとする
pattern = gets.chomp

# patternが含まれるかどうかを検索する文字列をstringとする
string = gets.chomp

# 含まれている回数をresultで数える
result = 0

# eachメソッドを使って指定文字列に含まれたパターン文字列を順番に取り出す
# 先頭0番目から文字列stringの文字数 - パターンpatternの文字数の位置の文字列を
# sliceメソッドで1文字ずつ取り出してsubstringに入れる
(0..(string.size - pattern.size)).each do |i|
  substring = string.slice(i, pattern.size)

  # 取り出した文字列substringと検索したいpatternが一致していればresultを1増やす
  if substring == pattern
    result += 1
  end
end

puts result

今回はeachメソッドとsliceメソッドを使って解きました。

スキルチェックでは他の人の解答を見たり聞いたりといったことはできませんが、実現したい処理の書き方を調べることは可能です。今回の例では、「文字列の中から特定の文字数を取り出すにはどうしたらいいか?」といったことを検索するとよいでしょう。


ちなみに今回のようにDランク問題を解いて、最終的にCランク問題を解くことを目指すという方法をPythonとPHPでも解説しています。

paiza.hatenablog.com

paiza.hatenablog.com

まとめ

Cランクの問題を解くためには、要求されている内容を分解して、Dランク問題を解くときに使った処理の組み合わせで考えていくという方針で解説をしてきました。

『コードクロニクル』をきっかけにpaizaを知ってくださった方の中には初めてプログラミングに触れる方もいらっしゃるかもしれませんが、おそらく『コードクロニクル』で基礎文法は身についていると思いますので、ぜひスキルチェックのDランク、Cランクそしてそれ以上のランクの問題にも挑戦してみてください。

paizaラーニングでは、「スキルチェック入門講座」を公開しています。初めてスキルチェックを受ける方向けの講座から、Bランク問題の解説まで、実際にコードを書きながら学ぶことができます。

言語の基本的な内容をもう少し学びたい方はRuby、Python、PHP、C#など主要言語の入門講座も公開していますのでチェックしてください。

20200121110334





paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

詳しくはこちら

paizaラーニング

そしてpaizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

詳しくはこちら

paizaのスキルチェック

paizaのおすすめコンテンツ

PPG proken プログラミングゲーム「初恋 プログラミング研究会〜海に行こうよ〜」 PPG Bingo プログラミングゲーム「コードレビューBINGO!!」
paiza転職 paiza新卒 EN:TRY paizaラーニング 記事内に記載している情報は、記事公開時点でのものとなります。 Copyright Paiza, Inc, All rights reserved.