작성일 :

문제 링크

5532번 - 방학 숙제

설명

방학 동안 해야 할 국어와 수학 숙제를 매일 일정량씩 푼다고 할 때,
모든 숙제를 완료하고 남은 일수만큼 놀 수 있는 날짜를 구하는 문제입니다.

  • 총 방학 일수가 주어지고, 국어와 수학 각각의 숙제량, 하루에 풀 수 있는 양이 주어집니다.
  • 숙제를 모두 끝낼 때까지는 매일 공부해야 하며,
  • 국어와 수학 중 더 오래 걸리는 과목을 기준으로 숙제를 마치는 날이 정해집니다.
  • 방학 총일수에서 숙제를 푸는 데 걸린 일수를 빼면 실제로 놀 수 있는 날이 됩니다.

접근법

  1. 입력으로 다음의 값들을 차례로 입력받습니다:
    • 방학 전체 일수
    • 국어 총 숙제량
    • 수학 총 숙제량
    • 하루에 풀 수 있는 국어 양
    • 하루에 풀 수 있는 수학 양
  2. 각 과목별로 숙제를 마치는 데 걸리는 날짜는 다음과 같이 계산합니다:
    \(\left\lceil \frac{\text{총 숙제량}}{\text{하루 제한량}} \right\rceil\)

    이 연산을 정수 연산으로 구현하면 다음과 같이 처리할 수 있습니다:
    \(\left\lfloor \frac{\text{총 숙제량} + \text{하루 제한량} - 1}{\text{하루 제한량}} \right\rfloor\)

  3. 국어와 수학 중 더 오래 걸리는 쪽을 기준으로 숙제 기간을 정한 후,
  4. 전체 방학 일수에서 숙제 일수를 빼면 남은 놀 수 있는 날짜가 됩니다.

Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;

class Program {
  static void Main() {
    int vacation = int.Parse(Console.ReadLine());
    int korean = int.Parse(Console.ReadLine());
    int math = int.Parse(Console.ReadLine());
    int perDayKorean = int.Parse(Console.ReadLine());
    int perDayMath = int.Parse(Console.ReadLine());

    int daysKorean = (korean + perDayKorean - 1) / perDayKorean;
    int daysMath = (math + perDayMath - 1) / perDayMath;
    int homeworkDays = Math.Max(daysKorean, daysMath);

    Console.WriteLine(vacation - homeworkDays);
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <bits/stdc++.h>

using namespace std;

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

  int v, l, m, pL, pM;
  cin >> v >> l >> m >> pL >> pM;

  int dL = (l + pL - 1) / pL;
  int dM = (m + pM - 1) / pM;
  cout << v - max(dL, dM) << "\n";

  return 0;
}