{ }codelper
三項演算子P0372

ロッカーの追加料金

駅の荷物ロッカーの基本料金は b ウォンである。
荷物を預けた時間が h 時間以下なら、追加料金はない(0 ウォン)。
預けた時間が h 時間より長ければ、追加料金 e ウォンを一度だけ加えて払う。
一行目に b、h、e が空白一つで区切って与えられる。
二行目に客の数 n が与えられる。
続く n 行に、客ごとの荷物を預けた時間 t が一行に一つずつ与えられる。
客ごとに払う料金(基本料金 + 追加料金)を、入力の順に一行に一つずつ出力せよ。

入力
1 ≤ b ≤ 10,000、1 ≤ h ≤ 100、1 ≤ e ≤ 10,000、1 ≤ n ≤ 100、1 ≤ t ≤ 200(すべて整数)
出力
n 行に、客ごとの料金を一つずつ。
カンマや単位をつけず数字だけを書く
例 1 · stdin
1000 3 500
3
2
3
5
stdout
1000
1000
1500
例 2 · stdin
700 24 700
2
24
25
stdout
700
1400
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

三項演算子は二つの値のうち一つを選ぶ式なので、足し算の中にそのまま入れられます。
C・C++・Java・C#・JS・TS・Craykon は 条件 ? 真のときの値 : 偽のときの値 の順なので b + (t <= h ? 0 : e) と書き、Python だけが 真のときの値 if 条件 else 偽のときの値 の順なので b + (0 if t <= h else e) と書きます。
落とし穴その一:かっこを外すと + が先に結びつきます。
C・C++・Java・C#・JS・TS・Craykon で b + t <= h ? 0 : e は (b + t <= h) ? 0 : e と読まれ、料金が 0 か e になります(例 1 が 500 500 500 になります)。
Python で b + 0 if t <= h else e は (b + 0) if t <= h else e と読まれ、時間を超えた客が e だけを払います(例 1 が 1000 1000 500 になります)。
落とし穴その二:三項演算子の代わりに JS (t <= h && 0) || e や Python t <= h and 0 or e でまねると、前の値 0 が偽として扱われ、条件が真でも e が出ます(例 1 が 1500 1500 1500 になります)。
落とし穴その三:「h 時間以下」は <= です。
< と書くと、ちょうど h 時間預けた客も追加料金を払います(例 1 が 1000 1500 1500 になります)。

Pythonmain.py · 7 行
b, h, e = map(int, input().split())n = int(input())for _ in range(n):    t = int(input())    # 값 if 조건 else 값 — 덧셈 안에 넣을 때는 괄호로 묶는다    fee = b + (0 if t <= h else e)    print(fee)
JavaScriptmain.js · 10 行
const nums = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const [b, h, e, n] = nums;const out = [];for (let i = 0; i < n; i++) {  const t = nums[4 + i];  // 조건 ? 값 : 값 — 덧셈 안에 넣을 때는 괄호로 묶는다  const fee = b + (t <= h ? 0 : e);  out.push(fee);}console.log(out.join("\n"));
TypeScriptmain.ts · 11 行
import { readFileSync } from "node:fs";const nums: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const [b, h, e, n] = nums;const out: number[] = [];for (let i = 0; i < n; i++) {  const t: number = nums[4 + i];  // 조건 ? 값 : 값 — 덧셈 안에 넣을 때는 괄호로 묶는다  const fee: number = b + (t <= h ? 0 : e);  out.push(fee);}console.log(out.join("\n"));
JavaMain.java · 15 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int b = sc.nextInt(), h = sc.nextInt(), e = sc.nextInt();        int n = sc.nextInt();        for (int i = 0; i < n; i++) {            int t = sc.nextInt();            // 조건 ? 값 : 값 — 덧셈 안에 넣을 때는 괄호로 묶는다            int fee = b + (t <= h ? 0 : e);            System.out.println(fee);        }    }}
C#Main.cs · 18 行
using System; class Program{    static void Main()    {        string[] head = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int b = int.Parse(head[0]), h = int.Parse(head[1]), e = int.Parse(head[2]);        int n = int.Parse(Console.ReadLine());        for (int i = 0; i < n; i++)        {            int t = int.Parse(Console.ReadLine());            // 조건 ? 값 : 값 — 덧셈 안에 넣을 때는 괄호로 묶는다            int fee = b + (t <= h ? 0 : e);            Console.WriteLine(fee);        }    }}
C++main.cpp · 13 行
#include <iostream> int main() {    int b, h, e, n;    std::cin >> b >> h >> e >> n;    for (int i = 0; i < n; i++) {        int t;        std::cin >> t;        // 조건 ? 값 : 값 — 덧셈 안에 넣을 때는 괄호로 묶는다        int fee = b + (t <= h ? 0 : e);        std::cout << fee << "\n";    }}
Cmain.c · 14 行
#include <stdio.h> int main(void) {    int b, h, e, n;    if (scanf("%d %d %d %d", &b, &h, &e, &n) != 4) return 0;    for (int i = 0; i < n; i++) {        int t;        if (scanf("%d", &t) != 1) return 0;        /* 조건 ? 값 : 값 — 덧셈 안에 넣을 때는 괄호로 묶는다 */        int fee = b + (t <= h ? 0 : e);        printf("%d\n", fee);    }    return 0;}
Craykonmain.cray · 12 行
head = コンソール.数読み();b = head[0];h = head[1];e = head[2];n = コンソール.行読み().数に();繰り返す (i = 0; i < n; i++){    t = コンソール.行読み().数に();    // 조건 ? 값 : 값 — 덧셈 안에 넣을 때는 괄호로 묶는다    fee = b + (t <= h ? 0 : e);    コンソール.書く(fee);}