물건을 상자에 나눠 담을 때 필요한 상자 수를 돌려주는 함수 상자수(물건, 한상자, 여유)를 만든다.
상자 하나에는 한상자 칸이 있고, 깨지지 않게 상자마다 여유 칸은 비워 둔다.
그래서 상자 하나에 물건을 (한상자 − 여유)개까지 담는다.
필요한 상자 수는 물건을 모두 담는 가장 적은 상자 수다. 물건이 0개면 0이다.
한상자를 주지 않으면 12로, 여유를 주지 않으면 0으로 친다.
여유만 주고 한상자를 빼는 일은 없다.
첫 줄에 질문 수 q가, 다음 q줄에 질문마다 정수 1~3개가 빈칸으로 나뉘어 주어진다.
수는 차례대로 물건, 한상자, 여유다. 그래서 수가 두 개면 둘째 수는 한상자다.
질문마다 상자 수를 한 줄에 출력하라.
기본값이 있는 매개변수(그런 문법이 없는 언어는 같은 이름의 함수 여러 개, 또는 부르는 쪽에서 채우기)로 풀어 보자.
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 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와 크레이콘에는 기본값도 오버로드도 없어서 부르는 쪽이 빠진 값을 12와 0으로 채워 세 개를 모두 넘겨요(크레이콘 상자수(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 0long 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));}