{ }codelper
멈추기·건너뛰기P0223

택배 트럭에 차례로 싣기

택배 트럭에 상자를 정해진 차례대로 싣는다. 첫 줄에 상자 수 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
입력(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);