작성일 :

문제 링크

9664번 - NASLJEDSTVO

설명

막내가 금화 T개를 N등분합니다. 각 부분은 T/N개 또는 T/N+1개가 되는데, 막내는 작은 부분을 가져갑니다.

막내가 가져간 후 남은 금화가 O개일 때, 가능한 초기 금화 수 T의 최솟값과 최댓값을 구하는 문제입니다.


접근법

먼저, 막내가 가져가는 금화 수는 T를 N으로 나눈 몫입니다. 따라서 남은 금화 O는 T에서 몫을 뺀 값입니다.

다음으로, T - T/N = O를 만족하는 T를 찾습니다. N과 O가 작으므로 T를 O부터 충분히 큰 값까지 순회하며 조건을 확인합니다.

이후, 조건을 만족하는 T 중 최솟값과 최댓값을 출력합니다.


Code

C#

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

namespace Solution {
  class Program {
    static void Main(string[] args) {
      var N = int.Parse(Console.ReadLine()!);
      var O = int.Parse(Console.ReadLine()!);

      var minT = int.MaxValue;
      var maxT = -1;
      var limit = 200000;
      for (var T = O; T <= limit; T++) {
        var q = T / N;
        if (T - q == O) {
          if (T < minT) minT = T;
          if (T > maxT) maxT = T;
        }
      }
      Console.WriteLine($"{minT} {maxT}");
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
using namespace std;

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

  int N, O;
  cin >> N >> O;

  int minT = INT_MAX, maxT = -1;
  const int LIMIT = 200000;
  for (int T = O; T <= LIMIT; T++) {
    int q = T / N;
    if (T - q == O) {
      minT = min(minT, T);
      maxT = max(maxT, T);
    }
  }
  cout << minT << " " << maxT << "\n";

  return 0;
}