{ }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()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

조건 안에 조건이 있을 때 else가 어느 if의 것인지가 이 문제의 함정이에요.
C·C++·Java·C#·JS·TS는 중괄호를 빼면 else가 가장 가까운 안쪽 if에 붙어요(dangling else).
그래서 if (회원) if (금액 >= 20000) 깎기; else 배달비;처럼 들여쓰기만 바깥에 맞추면, 20,000원이 안 되는 회원에게 배달비가 붙고 비회원은 그냥 지나가요.
크레이콘도 중괄호 없이 쓸 수 있고 아니면이 가장 가까운 만약에 붙어요.
바깥 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);