study
멀쩡한 사각형[프로그래머스]
Date: 2026-06-01 08:00
Update: 2026-06-01 08:09


멀쩡한 사각형[프로그래머스]

최대공약수 접근법:

  1. 대각선은 가로선을 W-1 번, 세로선을 H- 1 번을 지나며 총 W + H - 1 개의 사각형을 망가뜨립니다.
  2. 이때 최대 공약수 G 가 존재한다면 사각형을 작은 사각형인 W/G 와 H/G인 사각형 G개로 나눌수 있습니다.
  3. 각 작은 사각형 안에서 망가지는 개수는 W/G + H/G - 1 개 입니다.
  4. 총 망가지는 개수는 W + H - G 개 입니다.
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;

long long gcd(long long a, long long b)
{
    if(b == 0)
        return a;
    return gcd(b, a % b);
}

long long solution(int w,int h) {
    long long answer = 1;
    long long total = (long long)w * (long long)h;
    long long cut = (long long)w + (long long)h - gcd(w, h);
    answer = total - cut;
    return answer;
}

기울기 접근법:

  1. 대각선은 항상 0,0 에서부터 W,H 까지 지나간다는 것을 생각한 방법
  2. 대각선 아래에있는 멀쩡한 사각형의 갯수를 구한 다음, 이를 누적 한다.
  3. 총 사각형의 갯수는 대각선의 위와 아래 니깐 2배를 곱한다.
#include <iostream>

using namespace std;

long long solution(int w, int h) {
    long long answer = 0;
    
    // x를 1부터 w-1까지 돌면서 대각선 아래의 멀쩡한 사각형 개수를 구함
    for (int x = 1; x < w; ++x) {
        // y = (H * x) / W
        // 자료형 오버플로우를 막기 위해 명시적으로 (long long) 캐스팅
        long long y = ((long long)h * x) / w;
        
        // y값이 곧 해당 열의 온전한 사각형 개수 (C++ 정수 나눗셈은 자동으로 내림 처리됨)
        answer += y;
    }
    
    // 대각선 아래의 사각형만 구했으므로, 위쪽 영역까지 포함하기 위해 곱하기 2
    return answer * 2;
}