PaizaのC問題相当のレベルアップ問題集の解説記事を作成しました。
問題の参考リンクはこちらからどうぞ。
今回はこの問題集の中からみかんの仕分けについて解説しています。
難易度は1500前後、正答率が約75%の問題です(C問題の中ではちょうど真ん中あたりの難易度です)。
問題文と入力出力例
みかんはある定数 N の倍数のうち、正の整数の重さが書かれた箱に仕分けられます。
そして、みかんは一番近い重さの箱に仕分けられます。
このような箱が複数ある場合、重さが大きい方の箱に仕分けられます。
以下、箱の大きさがN=10と仮定します。
24gのみかんなら20gの箱に、35gのみかんなら40gの箱に入れてください。
ただし0gの箱はないため、例えば3gのみかんであった場合は10gの箱に入れてください。
入力例
10 3 (箱の単位、みかんの数)
24
35
3
出力例
20
40
10
解説
計算の考え方
まずは四捨五入ができる関数を思い出しましょう。
- Math.round()
→小数点の四捨五入ができる関数 - Math.floor()
→小数点以下を切り捨てる - Math.ceil()
→小数点以下を切り上げる
ただしこれらの関数は小数点のみに対応しているため、12を10にするということはできません。
今回はN刻みであるため、まずはNで割り、その後に関数を使い、Nをかけて戻すという発想です。
例えば6400円があり、1000円単位の貯金箱に分けたいとします。
つまり今回は6000円の貯金箱に入れたい話です。
6400 ÷ 1000 = 6.4(Nで割る)
小数点以下切り捨てで6.4→6です(関数を使う)
再び1000をかけると6000円になります(Nをかけて戻す)
ただし問題文には「0の箱はありません」という注意点があります。
お金の話で例えれば、800円であっても1000円の貯金箱に入れたいということです。
この場合はif else を使用するか、条件演算子を使います。
条件演算子の文法
→条件式 ? Trueの処理 : Falseの処理
入力出力の考え方
入力について
まずは箱の単位(N)とみかんの量の入力(M)を定数として宣言します。
const [N, M] = lines[0].split(" ").map(Number);今回は最初の入力でN、Mの間に半角があるため、split()で半角の空白で区切って単語にします。
また、入力はすべて文字として取り扱われるため、map(Number)を使って数字にします。
数字にしたい時
複数行ならmap(Number)、一つだけならNumber()。
次にみかんの数を入力していくのですが、みかんの数は固定されていないため、繰り返し処理をするためのfor文を使います。
for(let i = 1; i <= N; i++) { }範囲は1行目からみかんの数であるM行目までです。
for文の中身
先ほどと同じように、みかんを順番に見回っていくため、みかんのターゲットを宣言します。
const w = Number(lines[i])次に、計算式を宣言します。
const rounded = Math.round(w / N) * N;今回は改行ありで出力されるため、for文の中にconsole.log()を使います。
console.log(rounded === 0 ? N : rounded);全体のおさらいコード
reader.on('close', () => {
const [N, M] = lines[0].split(" ").map(Number);
for(let i = 1; i <= M; i++) {
const w = Number(lines[i]);
const rounded = Math.round(w / N) * N;
console.log(rounded === 0 ? N : rounded);
}
});
