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);
}
}
'algorithm' 카테고리의 다른 글
[프로그래머스]짝지어 제거하기 (0) | 2020.03.13 |
---|---|
[프로그래머스]더 맵게 (0) | 2020.03.07 |
[프로그래머스]기능개발 (0) | 2020.01.12 |
[프로그래머스]위장 (0) | 2020.01.08 |
[프로그래머스]프린터 (0) | 2020.01.02 |