작성일 :

문제 링크

11312번 - 삼각 무늬 - 2

설명

한 변의 길이가 큰 정삼각형 동일한 형태의 작은 정삼각형으로 정확히 덮으려 할 때, 필요한 개수를 구하는 문제입니다.


입력으로는 다음 두 값이 주어집니다:

  • A: 큰 정삼각형의 한 변 길이
  • B: 작은 정삼각형의 한 변 길이


이때 조건은 BA를 나누어 떨어지며, 정삼각형의 방향이 일정하게 정렬되어 있다는 가정 하에

큰 삼각형을 B 단위의 작은 삼각형으로 빈틈없이 덮는 데 필요한 최소 개수를 구해야 합니다.


접근법

정삼각형을 동일한 방향의 작은 정삼각형으로 채우는 경우, 가장 간단한 방법은 다음과 같습니다:

  • 한 변에 들어가는 개수는 A / B 개입니다.
  • 정삼각형은 계단처럼 줄어드는 구조이므로, 전체 면적은 작은 삼각형을 정사각형처럼 배치했을 때의 개수와 같습니다.

그 결과, 최종 개수는 다음과 같이 구할 수 있습니다:

\[\left(\frac{A}{B}\right)^2\]

이는 한 줄에 A / B개의 삼각형이 있고, 이런 줄이 A / B줄 반복된다는 구조를 떠올리면 이해하기 쉽습니다.

문제에서 항상 B <= A가 보장되므로 나눗셈 결과는 정수입니다.



Code

C#

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

class Program {
  static void Main() {
    int t = int.Parse(Console.ReadLine());
    while (t-- > 0) {
      var tokens = Console.ReadLine().Split();
      long a = long.Parse(tokens[0]);
      long b = long.Parse(tokens[1]);
      long res = (a / b) * (a / b);
      Console.WriteLine(res);
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

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

  int t; cin >> t;
  while (t--) {
    ll a, b; cin >> a >> b;
    cout << (a / b) * (a / b) << "\n";
  }

  return 0;
}