{ }codelper
引数P0257

既定値のある箱の数の関数

品物を箱に分けて入れるときに必要な箱の数を返す関数 箱数(品物, 一箱, 空き) を作る。
箱一つには一箱 個の枠があり、割れないように箱ごとに空き 個の枠は空けておく。
だから箱一つに品物を (一箱 − 空き) 個まで入れる。
必要な箱の数は、品物をすべて入れられるいちばん少ない箱の数である。
品物が 0 個なら 0 である。
一箱が与えられなければ 12、空きが与えられなければ 0 とみなす。
空きだけ与えて一箱を省くことはない。
一行目に質問の数 q、続く q 行に質問ごとに整数 1〜3 個が空白で区切って与えられる。
数は順に品物、一箱、空きである。
だから数が二つなら二つ目は一箱である。
質問ごとに箱の数を一行に出力せよ。
既定値のある引数(その文法がない言語は同じ名前の関数をいくつか、または呼ぶ側で埋める)で解いてみよう。

入力
1 ≤ q ≤ 1,000。
0 ≤ 品物 ≤ 1,000,000,000、1 ≤ 一箱 ≤ 1,000、0 ≤ 空き < 一箱(すべて整数)
出力
q 行、質問ごとに箱の数
例 1 · stdin
5
30
30 10
30 10 4
0 7 3
24
stdout
3
3
5
0
2
main.py
入力(stdin)

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

$ 準備完了

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

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

既定値の書き方は言語ごとに違います。
Python def boxes(items, size=12, gap=0)、JS・TS function boxes(items, size = 12, gap = 0)、C# static long Boxes(long items, int size = 12, int gap = 0)、C++ long long boxes(long long items, int size = 12, int gap = 0) のように引数の後ろに = 値 を付け、既定値のあるものは後ろにまとめます。
Java には既定値がないので boxes(items)、boxes(items, size) を別に作って(オーバーロード)長いほうを呼び、C と Craykon には既定値もオーバーロードもないので、呼ぶ側が抜けた値を 12 と 0 で埋めて三つとも渡します(Craykon 箱数(items, size, gap))。
引数は前から順に入ります。
だから数が二つなら二つ目は空きではなく一箱です。
引数を(品物、空き、一箱)の順に書いたり、Java のオーバーロードが受け取った値を違う位置に渡したりすると間違えます。
JS は抜けた引数が undefined になり、既定値は undefined のときだけ使われるので、既定値を書かないと計算が NaN になります。
Python は boxes(*nums)、JS は boxes(...nums) でリストを広げて渡せますが、TS は number[] を広げて渡すと個数が分からないので止めます(TS2556)。
個数どおりに呼びます。
切り上げ割り算も落とし穴です。
品物 // 枠 は残りの品物を落とし、商 + 1 は割り切れるときと 0 個のときに一つ多くなります。
C の ceil(items / k) は整数の割り算がすでに切り捨てなので役に立たず、(items + k - 1) / k を使います。

Pythonmain.py · 9 行
def boxes(items, size=12, gap=0):    per_box = size - gap          # 상자 하나에 담는 물건 수    return (items + per_box - 1) // per_box   # 올림 나눗셈(물건 0개면 0) q = int(input())for _ in range(q):    nums = list(map(int, input().split()))    # 수가 1~3개: 앞에서부터 items, size, gap에 들어가고 빠진 것은 기본값    print(boxes(*nums))
JavaScriptmain.js · 14 行
// 빠진 인자는 undefined가 되고, 기본값은 undefined일 때만 쓰인다function boxes(items, size = 12, gap = 0) {  const perBox = size - gap;  return Math.ceil(items / perBox);} const lines = require("fs").readFileSync(0, "utf8").split("\n");const q = Number(lines[0]);const out = [];for (let i = 1; i <= q; i++) {  const nums = lines[i].trim().split(/\s+/).map(Number);  out.push(boxes(...nums));}console.log(out.join("\n"));
TypeScriptmain.ts · 18 行
import { readFileSync } from "node:fs"; function boxes(items: number, size: number = 12, gap: number = 0): number {  const perBox = size - gap;  return Math.ceil(items / perBox);} const lines: string[] = readFileSync(0, "utf8").split("\n");const q = Number(lines[0]);const out: number[] = [];for (let i = 1; i <= q; i++) {  const nums = lines[i].trim().split(/\s+/).map(Number);  // number[]를 ...로 펼쳐 넘기면 TS가 개수를 몰라 막는다(TS2556) — 개수대로 부른다  if (nums.length === 1) out.push(boxes(nums[0]));  else if (nums.length === 2) out.push(boxes(nums[0], nums[1]));  else out.push(boxes(nums[0], nums[1], nums[2]));}console.log(out.join("\n"));
JavaMain.java · 34 行
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    // Java에는 기본값 매개변수가 없다 — 같은 이름의 메서드를 개수별로 두고(오버로드) 긴 쪽에 넘긴다    static long boxes(long items) {        return boxes(items, 12);    }     static long boxes(long items, int size) {        return boxes(items, size, 0);    }     static long boxes(long items, int size, int gap) {        int perBox = size - gap;        return (items + perBox - 1) / perBox;    }     public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int q = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int i = 0; i < q; i++) {            String[] p = br.readLine().trim().split("\\s+");            long items = Long.parseLong(p[0]);            long r;            if (p.length == 1) r = boxes(items);            else if (p.length == 2) r = boxes(items, Integer.parseInt(p[1]));            else r = boxes(items, Integer.parseInt(p[1]), Integer.parseInt(p[2]));            out.append(r).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 31 行
using System;using System.Text; class Program{    // 기본값은 컴파일할 때 정해지는 상수여야 하고, 기본값이 있는 매개변수는 뒤쪽에 둔다    static long Boxes(long items, int size = 12, int gap = 0)    {        int perBox = size - gap;        return (items + perBox - 1) / perBox;    }     static void Main()    {        int q = int.Parse(Console.ReadLine().Trim());        var sb = new StringBuilder();        for (int i = 0; i < q; i++)        {            string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            long items = long.Parse(p[0]);            long r = p.Length switch            {                1 => Boxes(items),                2 => Boxes(items, int.Parse(p[1])),                _ => Boxes(items, int.Parse(p[1]), int.Parse(p[2])),            };            sb.Append(r).Append('\n');        }        Console.Write(sb);    }}
C++main.cpp · 29 行
#include <iostream>#include <sstream>#include <string>#include <vector> // 기본값은 선언에 한 번만 적고, 기본값이 있는 매개변수는 뒤쪽에 둔다long long boxes(long long items, int size = 12, int gap = 0) {    int perBox = size - gap;    return (items + perBox - 1) / perBox;} int main() {    std::ios::sync_with_stdio(false);    std::string line;    std::getline(std::cin, line);    int q = std::stoi(line);    for (int i = 0; i < q; i++) {        std::getline(std::cin, line);        std::istringstream in(line);        std::vector<long long> v;        long long x;        while (in >> x) v.push_back(x);        long long r;        if (v.size() == 1) r = boxes(v[0]);        else if (v.size() == 2) r = boxes(v[0], (int)v[1]);        else r = boxes(v[0], (int)v[1], (int)v[2]);        std::cout << r << "\n";    }}
Cmain.c · 25 行
#include <stdio.h> /* C에는 기본값 매개변수도 오버로드도 없다 — 부르는 쪽이 빠진 값을 채워 세 개를 모두 넘긴다 */#define DEFAULT_SIZE 12#define DEFAULT_GAP 0 long boxes(long items, int size, int gap) {    int per_box = size - gap;    return (items + per_box - 1) / per_box;} int main(void) {    int q;    char line[128];    if (!fgets(line, sizeof line, stdin)) return 0;    sscanf(line, "%d", &q);    for (int i = 0; i < q; i++) {        fgets(line, sizeof line, stdin);        long items;        int size = DEFAULT_SIZE, gap = DEFAULT_GAP;        sscanf(line, "%ld %d %d", &items, &size, &gap);   /* 읽지 못한 값은 기본값 그대로 */        printf("%ld\n", boxes(items, size, gap));    }    return 0;}
Craykonmain.cray · 24 行
// 크레이콘에는 기본값 매개변수가 없다 — 부르는 쪽이 빠진 값을 채워 세 개를 모두 넘긴다상자수(items, size, gap){    perBox = size - gap;    返す 数学.商(items + perBox - 1, perBox); // 올림 나눗셈} q = コンソール.行読み().数に();繰り返す (i = 0; i < q; i++){    p = コンソール.行読み().空白除去().分ける(" ");    items = p[0].数に();    size = 12;    gap = 0;    もし (p.個数 >= 2)    {        size = p[1].数に();    }    もし (p.個数 >= 3)    {        gap = p[2].数に();    }    コンソール.書く(상자수(items, size, gap));}