프로그래머스 코딩테스트

프로그래머스 코딩테스트 - 연습문제 - 멀쩡한 사각형

정차노 2020. 8. 17. 18:59

문제 출처 : 프로그래머스/연습문제/멀쩡한 사각형

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

 

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

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

programmers.co.kr

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
    //2. 유클리드 호제법을 이용해서 최대공약수를 구한다.
    public long gcd(long idx1, long idx2) {
        while(idx2 > 0) {
            long tmp = idx1;
            idx1 = idx2;
            idx2 = tmp % idx2;
        }
        return idx1;        
    }
    
    public long solution(long w, long h) {
        long r = 0;
        //1. 숫자의 대소관계에 따라 다르게 메소드에 값을 넣는다.
        if(w > h) 
            r = gcd(w, h);
        else
            r = gcd(h, w);
        
        //3. 전체 갯수 - (가로 + 세로 - 가로세로의 최대공약수)를 하면 멀쩡한
        //사각형의 갯수가 나온다.
        return (w * h) - ((w + h) - r);
    }
}
cs

이번 문제는 직사각형에서 그어진 선이 지나가는 사각형을 제외한 멀쩡한 정사각형을 찾아내야 하는데 

한가지 공식을 적용하면 사각형의 갯수를 구할 수 있다. 

 

예를들어 

8 X 12일때 96개의 정사각형중 선이 지나가는 사각형은 16개로 멀쩡한 사각형의 갯수는 80개가 나온다.

4 X 4일때 16개의 정사각형중 선이 지나가는 사각형은 4개로 멀쩡한 사각형의 갯수는 12개가 나온다.

1 X 8일때 8개의 정사각형중 선이 지나가는 사각형은 8개로 멀쩡한 사각형의 갯수는 0개가 나온다.

4 X 6일때 24개의 정사각형중 선이 지나가는 사각형은 8개로 멀쩡한 사각형의 갯수는 16개가 나온다.

여기서 선이 지나가는 사각형의 규칙은 (가로 + 세로 - 가로세로의 최대공약수)이다.

 

이때 최대공약수를 구하는 공식으로 유클리드 호제법이라는 알고리즘을 사용하면 된다.

유클리드 호제법은

1. 두 수중 큰수와 작은수를 구분한다.

2. 두 수를 나눈 뒤 나온 나머지를 다시 작은수와 나눠서 또 다시 나머지를 구한다.(계속해서 작은 수와 나머지를 나눈다.)

3. 나머지가 0이 되는 순간 큰수가 최대공약수이다.