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

GomHyeok·2022년 5월 15일
0

📒활용개념

유클리드 호제법을 활용하여 중복되는 사각형의 크기를 구한다.

📌문제설명

가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 따라 1cm × 1cm의 정사각형으로 잘라 사용할 예정이었는데, 누군가가 이 종이를 대각선 꼭지점 2개를 잇는 방향으로 잘라 놓았습니다. 그러므로 현재 직사각형 종이는 크기가 같은 직각삼각형 2개로 나누어진 상태입니다. 새로운 종이를 구할 수 없는 상태이기 때문에, 이 종이에서 원래 종이의 가로, 세로 방향과 평행하게 1cm × 1cm로 잘라 사용할 수 있는 만큼만 사용하기로 하였습니다.
가로의 길이 W와 세로의 길이 H가 주어질 때, 사용할 수 있는 정사각형의 개수를 구하는 solution 함수를 완성해 주세요.

제한사항

W, H : 1억 이하의 자연수

제한사항을 통해서 완전탐색을 사용하면 시간복잡도를 초과할 수 있다는 생각을 했다.

📌구현

using namespace std;

//유클리드호제법을 사용하여 최대공약수 구하는 함수
int gcd (int w, int h){
    int a, b;
    int c=0;
    
    if(w>h){
        a=w;
        b=h;
    }
    else{
        a=h;
        b=w;
    }
    //유클리드호제법 사용
    while(b>0){
        c=a%b;
        a=b;
        b=c;
    }
    
    return a;
}

long long solution(int w,int h) {
    long long answer=0;
    //원래의 사각형 크기
    answer=(long long)w * h;
    //삭제되는 사각형을 위와 아래 방향으로 밀어본다면 가로와 세로길이를 더하고 중복되는 것
    //을 빼준 값이 된다. 그 중복되는 횟수는 최대공약수다.
    answer=answer-(w+h)+gcd(w, h);
    
    return answer;
}

예외 상황을 생각해야 하는 문제는 아니였다. 그렇기에 여러가지 사각형을 직접 그려보면서 삭제되어야 하는 사각형의 크기에 대한 수학적 식을 찾기위해 노력했다.

📌주의점

  • 분명 모든 사각형에 적용되는 식이 있을 것이라 생각했고 그 식을 찾는 것이 가장 중요했다.
  • 최대공배수과 최소공약수를 구하는 과정은 거의 대부분 유클리드호제법을 사용한다.
profile
github : https://github.com/GomHyeok/

0개의 댓글