Algorithm/Programmers(c++)

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

kim-hasa 2021. 8. 18. 17:42

https://programmers.co.kr/learn/courses/30/lessons/62048

 

코딩테스트 연습 - 멀쩡한 사각형

가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을

programmers.co.kr

가로세로가 주어진 직사각형 종이에 대각선이 그어져 있는데, 그어진 조각은 사용할 수 없으므로 멀쩡한 조각만 찾는 알고리즘입니다.

계산 방법이 있는데, 대각선이 지나가는 사각형의 개수는 가로 + 세로 - 최대공약수 입니다.

그러므로 총 사각형의 개수는 총 개수 - 가로 - 세로 + 최대공약수 입니다.

 

다만 수가 1억 이상이다보니, int형을 longlong으로 변환하는 과정에서 오류가 많이 나서 헷갈린 부분이 있었습니다.

long 형에 int * int를 넣는 경우, 두 수를 곱한 다음에 형변환을 하게 되므로 long형으로 계산되도록 형을 지정해 주었습니다.

using namespace std;

long long solution(int w,int h) {
    long long answer = 1;
    long long multi = (long)w*h;  // 총 박스의 개수
    long long sum = w + h;  // 합계
    int div = 2;            // 나누는 변수
    long long count = 1;    // 최대공약수
    if(w == h)
    {
        answer = multi - w; // 같은 경우
        return answer;
    }
    
    while(div <= w && div <= h)
    {
        if(w % div == 0 && h % div == 0)    // 둘다 나눠지는 경우
        {
            w = w/div;
            h = h/div;
            count = count * div;    // 최대공약수를 구함
        }
        else
        {
            div++;
        }
    }
    answer = multi - sum + count;
    
    return answer;
}