작성일 :

문제 링크

4349번 - Blocks

설명

부피가 N인 직육면체를 만들 때 가능한 최소 겉넓이를 출력하는 문제입니다.


접근법

세 변의 곱이 주어진 부피와 같은 모든 정수 조합을 탐색합니다.

각 조합에 대해 겉넓이를 계산하고 최소값을 갱신하여 출력합니다.


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;

class Program {
  static void Main() {
    var t = int.Parse(Console.ReadLine()!);
    for (var tc = 0; tc < t; tc++) {
      var n = int.Parse(Console.ReadLine()!);
      var best = int.MaxValue;
      for (var a = 1; a * a * a <= n; a++) {
        if (n % a != 0) continue;
        var n1 = n / a;
        for (var b = a; b * b <= n1; b++) {
          if (n1 % b != 0) continue;
          var c = n1 / b;
          var area = 2 * (a * b + b * c + c * a);
          if (area < best) best = area;
        }
      }
      Console.WriteLine(best);
    }
  }
}

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
#include <bits/stdc++.h>
using namespace std;

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

  int t; cin >> t;
  while (t--) {
    int n; cin >> n;
    int best = 1e9;
    for (int a = 1; a * a * a <= n; a++) {
      if (n % a != 0) continue;
      int n1 = n / a;
      for (int b = a; b * b <= n1; b++) {
        if (n1 % b != 0) continue;
        int c = n1 / b;
        int area = 2 * (a * b + b * c + c * a);
        if (area < best) best = area;
      }
    }
    cout << best << "\n";
  }

  return 0;
}