본문 바로가기

algorithm

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

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

 

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

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

programmers.co.kr

문제

  • 가로의 길이 W와 세로의 길이 H가 주어질 때, 사용할 수 있는 정사각형의 개수를 구하는 SOLUTION을 완성해라

제한 사항

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

입출력의 예

  • W = 8, H = 12, result = 80

풀이

직사각형의 각 변을 m,n이라고 할 떄 공식은 m+n-(m,n의 최대공약수) 입니다.

 

H, W 각 변의 크기를 비교하여 최대공약수의 값을 구할 준비를 한다.

	if (H > W) {
		big = H;
		small = W;
	} else {
		big = W;
		small = H;
	}

 

최대 공약수를 구하는 메서드 이다. a % b == 0 일 때는 b의 값이 최대 공약수가 된다.

아니면 재귀함수를 사용하여 a % b == 0 의 값을 찾아준다.  

  public static int gcd(int a, int b) {
		
	if (a % b == 0) {
		return b; 
	}	
       
	return gcd(b, a % b);
}

 

대각선이 닿지 않는 부분을 찾아야 하는 공식 이다.

answer = ((long)H * W) - (W + H - temp);

 

class Solution {
    
	public long solution(int W,int H) {
        
      	int big = 0, small = 0, temp = 0;
		long answer = 0;
		
		if (H > W) {
			big = H;
			small = W;
		} else {
			big = W;
			small = H;
		}
		
		temp = gcd(big, small);
        
     	answer = ((long)H * W) - (W + H - temp);
            
		return answer;
	}
    
    public static int gcd(int a, int b) {
		
		if (a % b == 0) {
			return b; 
		}	
        
		return gcd(b, a % b);
	}
}

참고[https://m.blog.naver.com/PostView.nhn?blogId=zzinuhelios&logNo=120024685950&proxyReferer=https%3A%2F%2Fwww.google.com%2F]

'algorithm' 카테고리의 다른 글

[프로그래머스]짝지어 제거하기  (0) 2020.03.13
[프로그래머스]더 맵게  (0) 2020.03.07
[프로그래머스]기능개발  (0) 2020.01.12
[프로그래머스]위장  (0) 2020.01.08
[프로그래머스]프린터  (0) 2020.01.02