この記事では、paizaラーニングのレベルアップ問題集を超初心者向けに解説します。
対象は、今までプログラミングをほとんどやったことが無い未経験者レベルを想定しています。
出来るだけ複数の言語で回答を載せ、ソースコードの中で解説するようにしています。
今回の問題は、【早解1】1日1万歩 (paizaランク D 相当)。
解説言語は、C++、Java、Kotlin です。
問題
【早解1】1日1万歩 (paizaランク D 相当)
あなたは健康のために、1日1万歩を歩くことを目標にしました。
入力として、歩いた距離(km)と歩幅(cm)が与えられるので、
1万歩を歩いているかどうかを判定して結果を出力してください。
https://paiza.jp/works/mondai/drankfast/d1_step_distance
入力される値
入力は以下のフォーマットで与えられます
d s
・d は歩いた距離(km)
・s は歩幅(cm)
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力
歩数が
・1万歩以上であれば yes
・1万歩より少なければ no
を出力してください。
ただし、歩いているときの歩幅は一定であるとします。
条件
すべてのテストケースにおいて、以下の条件をみたします。
0 ≤ d ≤ 20
30 ≤ s ≤ 100
入力例1
10 100
出力例1
yes
入力例2
5 60
出力例2
no
解答例&解説
方針
- 歩いた距離 d は km 単位で与えられるので、cm 単位に変換します。
- 1km は 1000m で、1m は 100cm です。
- 歩いた距離と 1 万歩分の距離を比較します。
- 今回の入力では大丈夫ですが、入力によってはオーバーフローに注意する必要があります。今回は d に 100000 を掛けたものと s に 10000 を掛けたものを比較するので、等価な比較として d に 10 を掛けたものと s を比較することでオーバーフローを避けることが考えられます。
C++
#include <iostream> // iostreamというライブラリを使いますという宣言
using namespace std; // std::cin、std::coutの std::を省略できるようにする宣言
// usingディレクティブの参考 https://docs.microsoft.com/ja-jp/cpp/cpp/namespaces-cpp?view=msvc-170#using_directives
int main() { // main関数とはプログラムの始まりの地点。intが付いているのでmain関数は整数型をreturnする
int d, s; // 変数の宣言。変数を使う前には宣言が必要。一行で d と s の2つの変数を同時に宣言している。
cin >> d >> s; // cinとは標準入力(キーボード)からの入力を表している。スペースで区切られた2つの文字をそれぞれ d と s に格納する。
if (d * 1000 * 100 >= s * 10000) { // 距離をcmに変換した値 ≧ 歩幅(cm) * 10000歩 を比較して真(true)か偽(false)を判定
cout << "yes" << endl; // 標準出力(画面など)に yes という文字列と endlで改行コードを出力する
} else { // 判定が偽(false)の場合はこちらを実行する
cout << "no" << endl; // 標準出力(画面など)に no という文字列と endlで改行コードを出力する
}
}
Java
import java.util.*; // java.utilパッケージのクラスを使えるようにする宣言。*はワイルドカードで全てのクラスをimportする
public class Main { // プログラムが開始されるクラスの名前はMainにすることが多いです
public static void main(String[] args) { // public static void mainメソッドはJavaのプログラムの始まりの地点
Scanner sc = new Scanner(System.in); // 標準入力(キーボード)からの入力を取得するためのオブジェクトを生成する
String[] input = sc.nextLine().split(" "); // Scannerオブジェクトを使って、標準入力から1行取得する。splitメソッドを使いスペースで区切られた文字を分割して配列に格納する。
int distance = Integer.parseInt(input[0]); // 配列の1要素目(添字は0)は距離が入っているので、int型に変換する。
int stride = Integer.parseInt(input[1]); // 配列の2要素目(添字は1)は歩幅が入っているので、int型に変換する。
if (distance * 1000 * 100 >= stride * 10000) { // 距離をcmに変換した値 ≧ 歩幅(cm) * 10000歩 を比較して真(true)か偽(false)を判定
System.out.println("yes"); // 標準出力(画面など)に yes という文字列を出力する
} else { // 判定が偽(false)の場合はこちらを実行する
System.out.println("no"); // 標準出力(画面など)に no という文字列を出力する
}
}
}
Kotlin
fun main(args: Array<String>) { // main関数はプログラムの始まりの地点。
val input = readLine()!!.split(" ") // 標準入力から1行取得する。splitメソッドを使いスペースで区切られた文字を分割してListに格納する。
val distance = input[0].toInt() // リストの1要素目(添字は0)は距離が入っているので、int型に変換する。
val stride = input[1].toInt() // リストの2要素目(添字は1)は歩幅が入っているので、int型に変換する。
when { // 距離をcmに変換した値 ≧ 歩幅(cm) * 10000歩 を比較して真(true)か偽(false)を判定する。
distance * 1000 * 100 >= stride * 10000 -> println("yes") // 真(true)の場合、yes を出力する。
else -> println("no") // 偽(false)の場合、no を出力する。
}
}
最後に
もし解説が分かりにくい箇所がありましたら、この記事のコメント欄で教えて下さい。
どのような箇所が難しいと感じているのかが知れると私もありがたいです。
本日も学習お疲れ様でした!