今回は paiza の「税込み価格」の問題に挑戦!
問題概要
何をする問題?
- 商品ごとに税率が異なるため、税込み価格を計算して値札を作る問題
入力
- 1行目
- 整数
N - 意味:商品の個数(1 ≦ N ≦ 100)
- 整数
- 2行目以降(
N行)- 各行に以下の2つが空白区切りで与えられる:
T_i P_i -
T_i:税率区分-
0→ 税率 10% -
1→ 税率 8%
-
-
P_i:商品の税抜き価格- 1 ≦ P_i ≦ 10000
- 各行に以下の2つが空白区切りで与えられる:
計算ルール
- 商品
iについて:-
T_i === 0の場合
→P_i× 1.1 -
T_i === 1の場合
→P_i× 1.08
-
- 小数点以下は切り捨て
出力
-
N行出力 -
i行目にはi番目の商品の税込み価格を出力 - 各結果は 改行区切り
入力例:
4
0 800
1 100
1 200
0 400
出力例:
880
108
216
440
✅OK例:
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
const N = Number(lines[0])
const tp = lines.slice(1).map(tp => tp.split(' ').map(Number));
for (let i = 0; i < N; i++) {
const [t, p] = tp[i];
if (t === 0) {
console.log(Math.floor(p * 1.1));
} else {
console.log(Math.floor(p * 1.08));
}
}
});
🔍コードの流れ
-
readlineを使って 標準入力を1行ずつ受け取る準備をする - 入力された各行を
lines配列に 順番に保存する - 入力がすべて終わったら(
closeが呼ばれたら)処理開始 -
lines[0]から 商品数Nを取得する -
lines[1]以降を-
"税率区分 価格"の形で分割 - 数値に変換して配列にする
-
-
forループで 商品を1つずつ処理 - 税率区分が
-
0→ 価格 × 1.1 -
1→ 価格 × 1.08
-
- 計算結果を
Math.floorで 小数点以下切り捨て - 各商品の 税込み価格を1行ずつ出力
✨少しスッキリさせる
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
const N = Number(lines[0]);
const tax = [1.1, 1.08];
for (let i = 1; i <= N; i++) {
const [t, p] = lines[i].split(' ').map(Number);
console.log(Math.floor(p * tax[t]));
}
});
ポイント
-
tax[t]
→t === 0 ? 1.1 : 1.08を 1行で表現 -
lines.slice(1)を使わない
→ 余計な配列を作らない分、処理も見た目も軽い - ループの
iが 入力行番号と一致
→ paizaの入力形式と対応が分かりやすい
📝まとめ
処理の流れ
- 入力をすべて読み込む
- 最初の行から N を取得
- 残りの行を1行ずつ処理
- 各行で
- 税率区分と価格を取り出す
- 税率を判定
- 税込み価格を計算
- 切り捨てて出力
✨実装テクニック
-
tax[t]のように、条件分岐を配列で簡潔に書ける -
lines[i]をそのまま処理 → 余計な配列を作らずに書ける - ループのインデックスと入力行を一致させる → バグりにくく、読みやすい