paiza times

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

logo

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

【Python】初心者でもできるプログラミング問題の簡単な解き方

f:id:paiza:20151116233950j:plain
Photo by Aeris Secure
f:id:paiza:20180910132940p:plainこんにちは。倉内です。

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

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

プログラミング初心者の方は、まずDランクの取得を目指してみてください。Dランク問題はプログラミング言語の基礎文法が習得できていれば解くことができます。

続いてCランクに挑戦していただきたいところですが…Cランクの問題はプログラミングを始めたばかりですとなかなか難しいと感じる方も多いようです。

そこで今回は、Dランクを取得した方が初めてCランク問題にチャレンジする際にどのように取り組んだらよいかを詳しく解説していきたいと思います。

なお、paizaラーニングではスキルチェックを解説する動画講座「スキルチェック入門編」を公開していますので、そちらもぜひチェックしてみてください。

 

スキルチェックとは

スキルチェック概要

前述のとおり、スキルチェックとは難易度別に分かれたプログラミング問題を解いて、プログラミングスキルを測るサービスです。

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

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

paizaのスキルチェック
 

標準入力をマスターする

スキルチェックで出題される問題の多くは、システムから与えられた値を取得して利用する必要があります。これを「標準入力から値を受け取る」と言います。

慣れないうちはその部分の処理を書くのにつまずく可能性があるので、初めて挑戦する方は以下の記事で紹介している標準入力解説動画をごらんください。

paiza.hatenablog.com


スキルチェックが何者か分かったので、さっそく問題にチャレンジしてみましょう。

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

そのためここからは「プログラミング練習問題」を活用して、Cランク問題を解く道筋を解説していきたいと思います。

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

DランクとCランクの違い

問題の内容は計算処理、文字列処理、パズルを解くものなどバラエティに富んでいるので一概には言えませんが、だいたいは以下のようなイメージです。

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

Cランク問題が難しく感じるのは、問題文で求められた内容を一気にコードにしようとしていることが一つの原因だと思います。そのためまずは問題内容をひとつひとつ分解してDランク問題レベルの処理に落として考えるという方針を立てます。

なお、問題を解く際に必須となるプログラミング言語の基礎文法は、paizaラーニングの言語別入門講座で網羅していますので、まず先にそちらを受講していただくとスムーズに取り掛かれます。

 

Dランク相当の練習問題を解く

練習問題ページには、プログラミング問題がスキルチェック同様にS~Dのランク別で用意されています。実際に元々はスキルチェックの本問題だった問題もあります。

今回はCランクに取り掛かる前に以下の練習問題を解いて基本文法をおさらいします。

※各練習問題のリンク先はPython3での回答ページとなっていますが、練習問題トップからアクセスしていただくと好きな言語を選択できます。

コードは練習問題の解答エリアで実行するか、paiza.IOを使って実際に手元で動作確認していただくと理解が深まるかと思います。(以降、Python3を用います)

N行のデータの入力

問題:

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

条件:

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

コード:
paizaラーニングの公式YouTubeアカウントで公開している解説動画とは少し異なるやり方で解いてみました。

# 与えられる文字列の個数N
N = int(input())

# N個の文字列を標準入力から受け取ってリストに格納して表示
word_list = []
for i in range(N):
    word_list.append(input())
    print(word_list[i])

 

数の並び替え

問題:

1行目で正の整数nが入力され、続くn行の各行で整数が1つずつ入力されます。n個の整数を小さい順に改行区切りで出力してください。

条件:

・1 ≦ n ≦ 100
・1 ≦ i ≦ nについて、1 ≦ a_i ≦ 1000

コード:
さきほど書いた「標準入力から与えられた値をリストに格納する」をここでも使いましょう。リストに入れたあと、リスト内の整数を「小さい順(=昇順)」にソートしておけば、あとはそのまま順に出力するだけでよさそうです。

ここで、Pythonでリスト内の昇順ソートをどう書けばよいかすぐ分からなくてもググれば大丈夫です。

今回は「Python リスト 昇順ソート」でキーワード検索した結果から、sortメソッドを使うとうまくいきそうだということが分かりました。

# 与えられる整数の個数n
n = int(input())

# N個の整数を標準入力から受け取ってリストに格納
num_list = []
for i in range(n):
    num_list.append(int(input()))

# リスト内の整数を昇順ソートする
num_list.sort()

# 要求通り1つずつ改行して出力
for i in range(n):
    print(num_list[i])

ちなみに、スキルチェック本問題でも言語の文法や機能について自分で調べるのはOKです。(答えを人やネット上で聞く、他人に代わりに解いてもらうのはNGです)

【競技1】合格判定

問題:

あなたはとある試験の合格判定をする仕事をします。
この試験は80点以上で合格です。
解答者の得点nが与えられるので合格(pass)か不合格(fail)を出力してください。

条件:

・1 ≦ n ≦ 100

コード:
単純な条件分岐ですが、「80点以上」という条件に気をつけましょう。

# 点数を標準入力から取得
score = int(input())

# 点数が80点以上ならpass、未満ならfailを出力
if(score >= 80):
    print("pass")
else:
    print("fail")

 

【早解14】0から9までのカウンタ

問題:

0から9までを数えるカウンタを考えます。
 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9

このカウンタの拡張として、任意の数から始められるカウンタを考えました。
(2から始める例、カウンタは9まで進んだら0に戻ります)
 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 0 → 1

入力から数字nを受け取り、nからカウンタをスタートさせて、
カウンタの値を順番に10個改行区切りで出力するプログラムを実装してください。

条件:

・0 ≦ n ≦ 9

コード:
この問題は実はDランク相当にしては少し難しい問題となっています。

ただ与えられたnを開始番号として10個数字を並べるだけなら簡単なのですが…

# これは9までいったあと0に戻らないのでNGコード
n = int(input())

for i in range(10):
    print(n)
    n += 1

9までカウントしてまだ10個出力していないなら0に戻るという条件を考慮する必要があります。練習問題の回答ページではn=0のケースしかテスト実行ができないため、paiza.IOを利用して複数のテストケースで正しい結果が得られることを確認しました。

# 開始番号nを取得
n = int(input())

# nが10まで進んだら0にリセットする、それ以外はパスして10個出力
for i in range(10):
    if(n == 10):
        n = 0
    else:
        pass
    
    print(n)
    n += 1

 

Cランク相当の練習問題を解く

いよいよCランクに挑戦です。今回は練習問題の「奇数大好き山田さん」を解きます。

地道な解き方をするので、スマートな解き方を知りたい方はこちらの解答コード(ただしRubyとPHPのみ)を参照してください。

問題:

あなたは奇数が大好きな山田さんと数字の仕分けをすることになりました。
仕分けをする数字が与えられますので、奇数であるものを小さい順に改行区切りで出力してください。

1行目で正の整数nが入力され、続くn行の各行で整数が1つずつ入力されます。

条件:

・1≦n≦1,000
・1 ≦ i ≦ nについて、1 ≦ a_i ≦ 10000

解き方:
<ポイントとなる箇所>
・与えられた数字のうち奇数のみを取り出す
・取り出した奇数は小さい順に出力する必要がある

<方針>
以下の4ステップで解くことにしました。よく見てみると、さきほどDランク相当の問題を解いたときの処理が結構使えそうですね。

  1. 標準入力から与えられるn行の値をリストに格納する
  2. リスト内の値のうち奇数のみを別のリストに移す
  3. 奇数のみのリスト内の整数を小さい順(=昇順)にソートする
  4. ソート後のリストから値を順番に改行区切りで出力する

値の奇数・偶数判定の処理が分からない場合は検索してみてください。

おそらく「割った余りが0に等しければ偶数、0でなければ奇数」という処理を書くとよいことが分かると思います。余りを求めるには「%」を使います。

コード:

# 1. 標準入力から与えられるn行の値をリストに格納する
n = int(input())

num_list = []
for i in range(n):
    num_list.append(int(input()))

# 2.リスト内の値のうち奇数のみを別のリストに移す
odd_list = []
for i in range(n):
    if(num_list[i] % 2 != 0):
        odd_list.append(num_list[i])
    else:
        pass

# 3. 奇数のみのリスト内の整数を小さい順(=昇順)にソートする
odd_list.sort()

# 4. ソート後のリストから値を順番に改行区切りで出力する
for i in range(len(odd_list)):
    print(odd_list[i])

さきほどと同じく、練習問題の回答ページでは1ケースしかテストできないので、paiza.IOで自分でいくつかテストケースを作成して正しい結果が得られることを確認してから提出しました。自分でテストを実施することで単純ミスを減らすことができ、惜しい減点を避けることができます。

この問題はCランクの中でも比較的易しい問題ではありますが、どのような問題でも解答のステップを整理してひとつひとつコードに落としていくことで道筋が見えてきます。


(参考)練習問題「お一人様一点限り
文字列を扱うCランク問題も参考までに解いておきます。

問題:

あるスーパーでは、お一人様一点限りでセール価格の商品を販売することにしました。
そこで、一人のお客さんが2回以上その商品を買えないように、お客さんの名前をチェックすることにしました。
お客さんn人の名前が来た順番で入力されるので、そのお客さんが初めて来た(YES)・初めてではない(NO)を判定し結果を出力してください。
ただし、同じ名前のお客さんはいないこととします。

条件:

・1 ≤ n ≤ 20
・1 ≤ (c_1の長さ), (c_2の長さ), ..., (c_nの長さ) ≤ 10

方針:

  1. リストにお客さんの名前を格納する
  2. その名前がリストに初めて格納されたことを「1つだけ存在すること」で判定する

検索してみると、リスト内に指定した値と同じ要素がいくつ存在するかを取得するには、countメソッドを使うとよいことが分かります。

コード:

# 1. リストにお客さんの名前を格納する
n = int(input())

person_list = []
for i in range(n):
    person_list.append(input())
    ## 2. その名前がリストに初めて格納されたことを「1つだけ存在すること」で判定する
    if(person_list.count(person_list[i]) == 1):
        print("YES")
    else:
        print("NO")

 

まとめ

Cランク問題は、問題文を見ただけだと「Dランクと全然違う…難しい……」と思いがちですが、実はじっくり見てみると分解すれば解けそうということが分かりました。

そのため初心者の方はまずはDランク問題をたくさん解いて武器を手に入れ、Cランク問題を解くときにそれらを組み合わせて戦えるようにしておいてください。

ここまでやってみて「なんかCランク取れそう!」と感じていただけたらうれしいです。ぜひスキルチェックの本問題にもチャレンジしてみてください!

paizaのスキルチェック





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.