paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」の開発者が、プログラミングやITエンジニアの転職などについて書いています。

Pythonで初心者向けプログラミング問題を解説する【ループ・条件分岐】

f:id:paiza:20140916135428p:plainこんにちは。谷口です。

paizaでは、レベル別に多数のプログラミングスキルチェック問題を公開しています。

問題はS・A・B・C・Dと5つのランクにわかれているので、初心者の方でもDランクから無理なくチャレンジできます。

ただ、プログラミング学習を始めたばかりだと「簡単な処理なら書けるけど、少し難しい問題になるとわからない」「わかなくなると挫折してしまう」という場合もありますよね。

そこで、paizaラーニングではスキルチェック入門編」を全編無料で公開しています。

スキルチェック入門編は、スキルチェック練習問題を題材に、単純な解き方だけでなく、さらにコードを見やすく・シンプルな処理に改善する方法や考え方などもあわせて解説しています。「プログラミングの勉強がしたい」「問題を解けるようになりたい」という方の役に立つ内容になっています。

今回、スキルチェック入門編3:単語のカウント (Cランク)」が追加されましたので、その内容をご紹介します。

※Pythonで解いていますが、解き方やアルゴリズムに関してはどの言語でも通じます。

問題:単語のカウント (Cランク相当)

※「こんな簡単な問題解説なしで解ける!」「まずはヒントなしで挑戦してみたい!」という方はこちらで解けます。

スペースで区切られた英単語列が与えられます。
英単語列に含まれる英単語の出現回数を出現した順番に出力してください。

入力される値:半角スペースで区切られた長さNの文字列
入力値最終行の末尾に改行が1つ入ります。 文字列は標準入力から渡されます。

期待する出力:単語、半角スペース、出現回数の順で1行に1単語で出現したすべての単語を、列に出現する順に出力してください。

条件:全てのテストケースにおいて以下の条件を満たします。
1 ≦ N ≦ 1,000

入力例から処理を考える

入力例1

red green blue blue green blue

出力例1

red 1
green 2
blue 3

まず、入力例1の英単語をリストに格納し、先頭の単語からカウントしていきます。

先頭はredで、リスト内のredを探しても先頭にしかないので、redの出現回数は1回です。 カウントし終えたredはリストから削除します。

redを削除すると先頭はgreenになります。リスト内のgreenを探すと、先頭以外にもう1つあるので、greenの出現回数は2回です。カウントし終えたgreenはリストから削除します。

greenを削除すると先頭はblueになります。リスト内のblueを探すと、先頭以外にもう2つあるので、blueの出現回数は3回です。カウントし終えたblueはリストから削除します。

redを削除するとリストは空になるので、これで単語のカウントは終了です。あとはカウントした結果を出力すればOKです。

入力例2

入力例2
Apple Apricot Orange Cherry Apple Orange Cherry Orange
出力例2
Apple 2
Apricot 1
Orange 3
Cherry 2

入力例1と同様にリストに格納し、先頭の単語からカウントしていきます。

先頭はAppleです。リスト内のAppleを探すと、先頭以外にもう1つあるので、Appleの出現回数は2回です。カウントし終えたAppleはリストから削除します。

Appleを削除すると先頭はApricotです。 リスト内のApricotを探しても先頭にしかないので、Apricotの出現回数は1回です。 カウントし終えたApricotはリストから削除します。

Apricotを削除すると先頭はOrangeです。 リスト内のOrangeを探すと、先頭以外にもう2つあるので、Orangeの出現回数は3回です。 カウントし終えたOrangeはリストから削除します。

Orangeを削除すると先頭はCherryです。 リスト内のCherryを探してみると、先頭以外にもう1つあるので、Cherryの出現回数は2回です。 カウントし終えたCherryはリストから削除します。

Cherryを削除するとリストは空になるので、これで単語のカウントは終了です。あとはカウントした結果を出力すればOKです。

「どんな処理がどんな順番で必要なのか」を頭の中だけで考えるのは難しいので、一度手元で図を書いたり、分解したりすると考えやすくなります。

実際にコードを書く

まずは入力値を取得する処理を書きます。空白区切りで複数の単語が入力されるので、こんな感じで受け取れます。

words = input().split()

input関数で入力値を受け取る際、split関数で入力値を分割してリストを作ります。

続いて、英単語をカウントする処理が必要です。できたリストの先頭の単語と、その単語がリスト内にいくつ存在するかを出力できるようにします。

words = input().split()

while words:
    count_word = words[0]
    print(count_word, words.count(count_word))

これで、単語ごとの出現回数を出力できます。

while文の条件は、wordsリストになっています。wordsリストの要素が残っている間はループして、wordsリストに要素がなくなったら終了です。

また、5行目のprint関数では、カンマで区切って2つの引数を指定しています。 print関数に複数引数を指定すると、半角スペース区切りで出力できるようになります。

上記のwhile文は、wordsリストの要素がなくならない限りループし続けます。 一度カウントした英単語はカウントしないようにしたいので、そのようにコードを修正してみましょう。

words = input().split()

while words:
    count_word = words[0]
    print(count_word, words.count(count_word))

    new_words = []
    for word in words:
        if word != count_word:
            new_words.append(word)

    words = new_words

for文でwordsリストの要素を順に確認して、出力した要素以外だった場合のみ、new_wordsリストに追加しています。 最後に、new_wordsリストをwordsに代入します。wordsリストは、ここで出力した要素を全て削除したリストとなります。

まとめ

とりあえずこれで答えは出ますので、ひとまず間違ってはいない解答コードができました。

ただ、少しコードの書き方が冗長な感じがするので、もっとシンプルなコードにできそうですね。

paizaラーニングの「スキルチェック入門編3」では、ここからさらに「リスト内包表記」を使って、もっと短くてシンプルにするにはどうすればいいか、そもそも「リスト内包表記」がどんな表記方法なのかも解説しています。

また、「スキルチェック入門編3」はpaizaで連載中の4コマ漫画「ぱいじょ!」の人気キャラクター・緑川つばめ(CV:戸村美優さん)が解説を務めます。

スキルチェック入門編1」では、さらに初心者向けにDランク問題の解き方から解説していますので、「全然わからなかった」という方は、まずそちらから始めてみたほうが無理なく学べます。

また、paizaラーニングの「アルゴリズム入門編」では、FizzBuzz、フィボナッチ数やハノイの塔といった、就職・転職の技術面接などでもよく出題されるプログラミング問題のアルゴリズムを解説しています。


「もっと難しい問題をやってみたい」「まずはヒントなしで問題を解いてみたい」という方は、スキルチェック問題に挑戦してみてください。
詳しくはこちら
paizaのスキルチェック

現在paizaラーニングの学習動画1,000本突破記念として、6/4(火)23:59までにスキルチェック問題に挑戦して結果をツイートしていただくと、抽選でAmazonギフト券が当たるキャンペーンを実施中です。

問題はどれでもOK、正解できなくてもOKですので、プログラミング初心者の方もぜひ挑戦してみてください!





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

詳しくはこちら

paizaラーニング

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

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

詳しくはこちら

paizaのスキルチェック





※このブログで紹介しているキャンペーンやイベント、およびサイト内の情報については、すべて記事公開時の情報となります。閲覧されたタイミングによっては状況が変わっている場合もございますのでご了承ください。

ITプログラマー・エンジニア転職・就活・学習のpaiza

プログラミング入門講座|paizaラーニング

PHP入門編Ruby入門編Python入門編Java入門編JavaScript入門編C言語入門編C#入門編アルゴリズム入門編AI機械学習入門

エンジニアのためのプログラミング転職サイト|paiza転職

プログラミング スキルチェックエンジニア求人一覧

未経験からエンジニアを目指す人の転職サイト|EN:TRY

プログラミング スキルチェックエンジニア未経験可求人一覧

エンジニアを目指す学生の就活サイト|paiza新卒

プログラミング スキルチェックエンジニア求人一覧

ブラウザを開くだけで エディタ、Webサーバ、DB等の開発環境が整う|PaizaCloud