택배 트럭에 상자를 정해진 차례대로 싣는다.
첫 줄에 상자 수 n, 트럭에 실을 수 있는 무게의 합 C, 상자 하나의 무게 한도 L이 빈칸으로 띄워 주어진다.
둘째 줄에 상자 n개의 무게가 싣는 차례대로 빈칸으로 띄워 주어진다. 상자 번호는 이 차례대로 1번부터 붙인다.
상자를 1번부터 하나씩 보며 다음 규칙을 위에서부터 따른다.
상자의 무게가 L보다 무거우면 그 상자는 싣지 않고 따로 보낸 뒤, 다음 상자로 넘어간다.
그렇지 않을 때, 그 상자를 실으면 실린 무게의 합이 C보다 커지면 그 상자에서 멈춘다.
멈추면 그 상자와 그 뒤의 상자는 모두 싣지도 따로 보내지도 않는다. 뒤에 가벼운 상자가 있어도 마찬가지다.
둘 다 아니면 그 상자를 싣는다. 실은 뒤의 합이 C와 딱 같아도 된다.
실은 상자 수, 실린 무게의 합, 따로 보낸 상자 수, 멈춘 상자의 번호를 빈칸 하나씩 띄워 한 줄에 출력하라.
마지막 상자까지 보고도 멈추지 않았으면 멈춘 상자의 번호 자리에 0을 출력한다.
입력
1 ≤ n ≤ 10,000, 1 ≤ L ≤ C ≤ 1,000,000, 1 ≤ 상자 무게 ≤ 1,000,000. 모두 정수
출력
실은 상자 수, 실린 무게의 합, 따로 보낸 상자 수, 멈춘 상자 번호(멈추지 않았으면 0) 한 줄
예시 1 · stdin
6 15 8
5 9 6 7 2 1
stdout
2 11 1 4
예시 2 · stdin
5 10 5
4 4 9 1 3
stdout
3 9 1 5
main.py
오류 목록00F8 ↓ · ⇧F8 ↑
입력(stdin)
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
이 상자만 건너뛰는 것은 continue, 반복 전체를 끝내는 것은 break예요. Python·JS·TS·Java·C#·C·C++ 모두 같은 낱말을 쓰고, 크레이콘은 건너뛰기와 그만이에요. 둘을 바꿔 쓰는 게 가장 흔한 실수예요. 넘칠 때 continue를 쓰면 뒤에 오는 가벼운 상자를 계속 실어서 틀리고, 무거운 상자에서 break를 쓰면 뒤의 상자를 하나도 보지 않아요. 규칙의 차례도 중요해요. 넘치는지를 먼저 물으면 넘칠 자리에 온 무거운 상자에서 멈춰 버리는데, 그 상자는 따로 보내야 해요. 합이 딱 C여도 실으니 >=가 아니라 >로 물어요. break는 가장 안쪽의 반복 하나만 끝내고, C·C++·Java·JS·TS·C#의 switch 안에서 쓰면 switch만 빠져나와요(크레이콘 선택 안의 그만도 같아요). 멈춘 번호를 따로 두지 않고 Python의 for … else(끝까지 break 없이 돌았을 때만 else가 돈다)를 쓸 수도 있어요. 번호를 0부터 세는 반복이면 출력할 때 1을 더해요.
Pythonmain.py · 14 줄
n, cap, limit = map(int, input().split())boxes = list(map(int, input().split()))loaded = total = sent = 0stop = 0for i, w in enumerate(boxes, start=1): if w > limit: # 너무 무거운 상자: 따로 보내고 다음 상자로 sent += 1 continue if total + w > cap: # 실으면 넘친다: 여기서 아예 멈춘다 stop = i break loaded += 1 total += wprint(loaded, total, sent, stop)
JavaScriptmain.js · 19 줄
const [n, cap, limit, ...boxes] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);let loaded = 0;let total = 0;let sent = 0;let stop = 0;for (let i = 0; i < n; i++) { const w = boxes[i]; if (w > limit) { sent++; continue; // 이 상자만 건너뛴다 } if (total + w > cap) { stop = i + 1; break; // 반복 전체를 끝낸다 } loaded++; total += w;}console.log(`${loaded} ${total} ${sent} ${stop}`);
TypeScriptmain.ts · 20 줄
import { readFileSync } from "node:fs";const [n, cap, limit, ...boxes]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);let loaded = 0;let total = 0;let sent = 0;let stop = 0;for (let i = 0; i < n; i++) { const w: number = boxes[i]; if (w > limit) { sent++; continue; // 이 상자만 건너뛴다 } if (total + w > cap) { stop = i + 1; break; // 반복 전체를 끝낸다 } loaded++; total += w;}console.log(`${loaded} ${total} ${sent} ${stop}`);
JavaMain.java · 30 줄
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(in.readLine()); int n = Integer.parseInt(st.nextToken()); int cap = Integer.parseInt(st.nextToken()); int limit = Integer.parseInt(st.nextToken()); st = new StringTokenizer(in.readLine()); int loaded = 0, total = 0, sent = 0, stop = 0; for (int i = 1; i <= n; i++) { int w = Integer.parseInt(st.nextToken()); if (w > limit) { sent++; continue; // 이 상자만 건너뛴다 } if (total + w > cap) { stop = i; break; // 반복 전체를 끝낸다(남은 수는 읽지 않아도 된다) } loaded++; total += w; } System.out.println(loaded + " " + total + " " + sent + " " + stop); }}
C#Main.cs · 30 줄
using System;using System.Linq;class Program{ static void Main() { int[] first = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); int n = first[0], cap = first[1], limit = first[2]; int[] boxes = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); int loaded = 0, total = 0, sent = 0, stop = 0; for (int i = 0; i < n; i++) { int w = boxes[i]; if (w > limit) { sent++; continue; // 이 상자만 건너뛴다 } if (total + w > cap) { stop = i + 1; break; // 반복 전체를 끝낸다 } loaded++; total += w; } Console.WriteLine($"{loaded} {total} {sent} {stop}"); }}
C++main.cpp · 25 줄
#include <iostream>#include <vector>int main() { std::ios::sync_with_stdio(false); int n, cap, limit; std::cin >> n >> cap >> limit; std::vector<int> boxes(n); for (int& w : boxes) std::cin >> w; int loaded = 0, total = 0, sent = 0, stop = 0; for (int i = 0; i < n; i++) { int w = boxes[i]; if (w > limit) { sent++; continue; // 이 상자만 건너뛴다 } if (total + w > cap) { stop = i + 1; break; // 반복 전체를 끝낸다 } loaded++; total += w; } std::cout << loaded << " " << total << " " << sent << " " << stop << "\n";}
Cmain.c · 22 줄
#include <stdio.h>int main(void) { int n, cap, limit, w; int loaded = 0, total = 0, sent = 0, stop = 0; scanf("%d %d %d", &n, &cap, &limit); for (int i = 1; i <= n; i++) { scanf("%d", &w); if (w > limit) { sent++; continue; /* 이 상자만 건너뛴다 */ } if (total + w > cap) { stop = i; break; /* 반복 전체를 끝낸다 */ } loaded++; total += w; } printf("%d %d %d %d\n", loaded, total, sent, stop); return 0;}
Craykonmain.cray · 26 줄
first = 콘솔.수들읽기();n = first[0];cap = first[1];limit = first[2];boxes = 콘솔.수들읽기();loaded = 0;total = 0;sent = 0;stop = 0;반복 (i = 0; i < n; i++){ w = boxes[i]; 만약 (w > limit) { sent++; 건너뛰기; // 이 상자만 건너뛴다 } 만약 (total + w > cap) { stop = i + 1; 그만; // 반복 전체를 끝낸다 } loaded++; total += w;}콘솔.쓰기(loaded + " " + total + " " + sent + " " + stop);