잡다한 배똥월드

728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? X

 

 

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

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

programmers.co.kr

 

 

 

 

 

class Solution {
    public long solution(int w, int h) {
        long answer = (long) w * h;
        int temp = 0;
        
        for (int i = Math.min(w, h); i >= 1; i--) {
            if (w % i == 0 && h % i == 0) {
                temp = i;
                break;
            }
        }
        
        return answer - ((w / temp) + (h / temp) - 1) * temp;
    }
}

 

테스트 1 통과 (0.07ms, 71.1MB)
테스트 2 통과 (0.15ms, 76.3MB)
테스트 3 통과 (0.11ms, 72.8MB)
테스트 4 통과 (0.11ms, 77.2MB)
테스트 5 통과 (0.11ms, 74.2MB)
테스트 6 통과 (0.22ms, 75.8MB)
테스트 7 통과 (0.06ms, 71MB)
테스트 8 통과 (0.17ms, 72.7MB)
테스트 9 통과 (0.06ms, 74.5MB)
테스트 10 통과 (0.05ms, 74.1MB)
테스트 11 통과 (0.08ms, 77.5MB)
테스트 12 통과 (0.05ms, 77.5MB)
테스트 13 통과 (29.33ms, 85.3MB)
테스트 14 통과 (0.06ms, 77.5MB)
테스트 15 통과 (45.74ms, 79.3MB)
테스트 16 통과 (1.08ms, 77.4MB)
테스트 17 통과 (20.04ms, 80.8MB)
테스트 18 통과 (0.07ms, 73.7MB)

 

 

 

 

 

 

테스트 케이스의 위 도형을 보면 대각선이 꼭지점을 지나는 부분은

( 0 0 ), ( 2 3 ), ( 4 6 ), ( 6, 9 ), ( 8 12 ) 이다.

 

 

이걸 봤을 때 가로는 2씩, 세로는 3씩 커지는 것을 볼 수 있는데

각각 가로 세로 높이를 2와 3으로 나눠보면 4라는 숫자가 나오는 것을 알 수 있다.

가로와 세로가 8과 12라는 것을 봤을 때 최대공약수인 것을 알 수 있다.

 

 

 

 

그래서 최대 공약수를 구하고

최대 공약수를 이용해서 반복하는 칸에서 대각선이 지나가는 칸을 구해야하는데

위의 예제에서도 4칸인데, 다른 도형의 경우도 계산을 해보면 반복되는 가로 길이 + 반복되는 세로 길이 - 1이라는 공식이 나온다.

최종 공식은 전체 크기 - {(가로 / 최대공약수) + (세로 / 최대공약수) - 1 } * 최대공약수 이다.

 

 

 

 

참고 링크

 

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

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/62048 코딩테스트 연습 - 멀쩡한 사각형 | 프로그래머스 가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로..

taesan94.tistory.com

 

 

 

 

728x90

+ Recent posts