Algorithm/Programmers

[Programmers] 멀쩡한 사각형

goakgoak 2020. 6. 1. 21:28

[Level 2] 멀쩡한 사각형

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

  • 가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm * 1cm 크기 입니다.
  • 누군가 이 종이를 대각선 꼭지점 2개를 잇는 방향으로 잘라놓았습니다.
  • 가로의 길이 W와 세로의 길이 H가 주어질 때, 사용할 수 있는 정사각형의 개수를 구하는 solution 함수를 완성해주세요.

 

 

Solution

  • 아이디어를 생각하기 어렵다 ㅠ-ㅠ,,
  • 예시를 기준으로 12*8 크기의 직사각형 종이가 있을 때, 사용할 수 없는 정사각형의 패턴을 보면 2*3 크기의 직사각형 내에서 테트리스 모양의 4개의 정사각형은 사용할 수 없음을 알 수 있다.
  • 여기서  다음과 같은 식을 도출 할 수 있고, 2(W) + 3(H) - 1 = 4
  • 12*8 직사각형에서 이러한 패턴을 가진 2*3 직사각형의 개수는 총 4개이다. 4 * (2 + 3 - 1 ) =16
  • 4개의 직사각형 개수는 12와 8의 최대 공약수를 의미한다. 
  • 따라서 사용할 수 없는 정사각형의 개수는 W + H - (W, H)의 최대공약수라는 식을 도출 할 수 있다.

 

 

 

소스코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
    public long solution(int w, int h) {
       long lw = (long)w;
        long lh = (long)h;
        long answer = lw*lh;
       
        answer -= (lw + lh - gcd(lw,lh));
        return answer;
    }
    
    public static long gcd(long w, long h){
        if(h == 0){
            return w;
        }else{
            return gcd(h, w%h);
        }
    }
}
cs