오늘의 알고리즘
[C++]Summer/Winter Coding(2019)멀쩡한 사각형
하늘하늘 .
2022. 1. 28. 16:19
using namespace std;
long long solution(int w, int h)
{
if (w == h)
return (long long)w * (long long)h - (long long)w;
long long gcd = 0;
long long small = 0;
if (w >= h)
small = h;
else
small = w;
for (long long i = 1; i <= small; ++i)
{
if (w % i == 0 && h % i == 0)
gcd = i;
}
return (long long)w * (long long)h - ((long long)w + (long long)h - gcd);
}
처음에는 그냥 음 라인에 걸리는 것만 하면 되려나 했는데 생각보다 더 쉬웠다...
걸리는 사각형들을 보면 2 x 3 박스 안에 4개씩 걸리는데
이 2 x 3 박스가 8 x 12 내에 4개가 들어있다.
즉 ( 2 x 4 ) x ( 3 x 4 ) 두 수의 최대공약수를 구한다면 더 쉬워진다.
모든 직사각형을 구하고 해당하는 직사각형들(x축, y축의 길이만큼)을 빼고
그만큼 최대 공약수( 2x3박스 수)를 더해주면 된다.
하지만 더 간단한 것
( 처음에 말한 것에 반대로 걸리지 않는 것들을 다 구하는 것 )
long long solution(int w, int h) {
long long answer = 0;
for (int i = 0; i < w; ++i) {
answer += (int)((double)h*i/w);
}
return 2 * answer;
}