작성일 :

문제 링크

1434번 - 책 정리

설명

박스와 책이 순서대로 주어지고, 책을 순서대로 박스에 넣을 때 낭비되는 용량의 합을 구하는 문제입니다. 책이 현재 박스에 들어가지 않으면 그 박스를 봉인하고 다음 박스를 사용합니다.


접근법

첫 번째 박스부터 시작해서 각 책을 순서대로 넣습니다. 현재 박스에 책이 들어가면 박스 용량에서 책 크기를 빼고, 들어가지 않으면 현재 박스의 남은 용량을 낭비에 더한 뒤 다음 박스로 넘어갑니다. 모든 책을 넣은 후 사용하지 않은 박스들의 용량도 낭비에 더하여 출력합니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Linq;

class Program {
  static void Main() {
    var nm = Console.ReadLine()!.Split().Select(int.Parse).ToArray();
    var n = nm[0];
    var m = nm[1];
    var box = Console.ReadLine()!.Split().Select(int.Parse).ToArray();
    var book = Console.ReadLine()!.Split().Select(int.Parse).ToArray();

    var waste = 0;
    var idx = 0;
    foreach (var b in book) {
      while (idx < n && box[idx] < b) {
        waste += box[idx];
        box[idx] = 0;
        idx++;
      }
      if (idx < n) box[idx] -= b;
    }
    while (idx < n) {
      waste += box[idx];
      idx++;
    }
    Console.WriteLine(waste);
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <bits/stdc++.h>
using namespace std;

typedef vector<int> vi;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n, m; cin >> n >> m;
  vi box(n), book(m);
  for (int i = 0; i < n; i++)
    cin >> box[i];
  for (int i = 0; i < m; i++)
    cin >> book[i];

  int waste = 0;
  int idx = 0;
  for (int b : book) {
    while (idx < n && box[idx] < b) {
      waste += box[idx];
      box[idx] = 0;
      idx++;
    }
    if (idx < n) box[idx] -= b;
  }
  while (idx < n) {
    waste += box[idx];
    idx++;
  }
  cout << waste << "\n";

  return 0;
}