{ }codelper
条件分岐入れ子の条件P0191

会員割引と配達料

町のパン屋が、オンライン注文の支払い額を決める。
一行目に注文の数 n、続く n 行に注文ごとの客の種類と注文金額が空白一つで区切って与えられる。
客の種類は、会員なら M、非会員なら G である。
会員は、注文金額が 20,000 ウォン以上なら 2,000 ウォン引き、20,000 ウォンより少なければ注文金額のまま払う。
非会員は、金額に関係なく配達料 3,000 ウォンを足して払う。
注文ごとの支払い額を、入力の順に一行に一つずつ出力せよ。
最後の行に支払い額の合計を出力せよ。

入力
1 ≤ n ≤ 1,000、1,000 ≤ 注文金額 ≤ 1,000,000(整数)、客の種類は M または G
出力
n 行に支払い額、最後の行にその合計(どれもカンマや「ウォン」をつけない整数だけ)
例 1 · stdin
4
M 25000
M 18000
G 18000
M 20000
stdout
23000
18000
21000
18000
80000
main.py
入力(stdin)

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

$ 準備完了

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

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

条件の中に条件があるとき、else がどの if のものかがこの問題の落とし穴です。
C・C++・Java・C#・JS・TS では、波かっこを省くと else はいちばん近い内側の if につきます(dangling else)。
そのため if (会員) if (金額 >= 20000) 割引; else 配達料; と字下げだけ外側に合わせると、20,000 ウォンに届かない会員に配達料がつき、非会員はそのまま通ります。
Craykon も波かっこなしで書けて、でなければ はいちばん近い もしにつきます。
外側の if ごとに波かっこを書けばこうはなりません。
Python は字下げがそのまま文法なので、else: を外側の if と同じ列に置けば外側のものになります。
もう一つよくある間違いは、二つの条件を 会員 && 金額 >= 20000 とまとめることです。
すると else が「非会員」だけでなく「20,000 ウォン未満の会員」まで覆ってしまいます。
境界のちょうど 20,000 ウォンは >= で聞かないと割引になりません。
合計は最大 1,003,000,000 ウォンで、32 ビット整数に収まります。

Pythonmain.py · 13 行
n = int(input())total = 0for _ in range(n):    kind, amount = input().split()    pay = int(amount)    if kind == "M":        if pay >= 20000:            pay -= 2000    else:        pay += 3000  # 비회원은 금액과 상관없이 배달비    print(pay)    total += payprint(total)
JavaScriptmain.js · 19 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const out = [];let total = 0;for (let i = 1; i <= n; i++) {  const [kind, amount] = lines[i].trim().split(" ");  let pay = Number(amount);  if (kind === "M") {    if (pay >= 20000) {      pay -= 2000;    }  } else {    pay += 3000; // 비회원은 금액과 상관없이 배달비  }  out.push(pay);  total += pay;}out.push(total);console.log(out.join("\n"));
TypeScriptmain.ts · 20 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const out: number[] = [];let total = 0;for (let i = 1; i <= n; i++) {  const [kind, amount] = lines[i].trim().split(" ");  let pay = Number(amount);  if (kind === "M") {    if (pay >= 20000) {      pay -= 2000;    }  } else {    pay += 3000; // 비회원은 금액과 상관없이 배달비  }  out.push(pay);  total += pay;}out.push(total);console.log(out.join("\n"));
JavaMain.java · 26 行
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(in.readLine().trim());        StringBuilder out = new StringBuilder();        long total = 0;        for (int i = 0; i < n; i++) {            String[] p = in.readLine().trim().split(" ");            int pay = Integer.parseInt(p[1]);            if (p[0].equals("M")) {                if (pay >= 20000) {                    pay -= 2000;                }            } else {                pay += 3000; // 비회원은 금액과 상관없이 배달비            }            out.append(pay).append('\n');            total += pay;        }        out.append(total).append('\n');        System.out.print(out);    }}
C#Main.cs · 32 行
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        var sb = new StringBuilder();        long total = 0;        for (int i = 0; i < n; i++)        {            string[] p = Console.ReadLine().Trim().Split(' ');            int pay = int.Parse(p[1]);            if (p[0] == "M")            {                if (pay >= 20000)                {                    pay -= 2000;                }            }            else            {                pay += 3000; // 비회원은 금액과 상관없이 배달비            }            sb.Append(pay).Append('\n');            total += pay;        }        sb.Append(total).Append('\n');        Console.Write(sb);    }}
C++main.cpp · 23 行
#include <iostream>#include <string> int main() {    int n;    std::cin >> n;    long long total = 0;    for (int i = 0; i < n; i++) {        std::string kind;        int pay;        std::cin >> kind >> pay;        if (kind == "M") {            if (pay >= 20000) {                pay -= 2000;            }        } else {            pay += 3000; // 비회원은 금액과 상관없이 배달비        }        std::cout << pay << '\n';        total += pay;    }    std::cout << total << '\n';}
Cmain.c · 23 行
#include <stdio.h> int main(void) {    int n;    scanf("%d", &n);    long long total = 0;    for (int i = 0; i < n; i++) {        char kind[2];        int pay;        scanf("%1s %d", kind, &pay);        if (kind[0] == 'M') {            if (pay >= 20000) {                pay -= 2000;            }        } else {            pay += 3000; /* 비회원은 금액과 상관없이 배달비 */        }        printf("%d\n", pay);        total += pay;    }    printf("%lld\n", total);    return 0;}
Craykonmain.cray · 21 行
n = コンソール.行読み().数に();total = 0;繰り返す (i = 0; i < n; i++){    p = コンソール.行読み().空白除去().分ける();    pay = p[1].数に();    もし (p[0] == "M")    {        もし (pay >= 20000)        {            pay -= 2000;        }    }    でなければ    {        pay += 3000; // 비회원은 금액과 상관없이 배달비    }    コンソール.書く(pay);    total += pay;}コンソール.書く(total);