1. 문제 설명
가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 따라 1cm × 1cm의 정사각형으로 잘라 사용할 예정이었는데, 누군가가 이 종이를 대각선 꼭지점 2개를 잇는 방향으로 잘라 놓았습니다. 그러므로 현재 직사각형 종이는 크기가 같은 직각삼각형 2개로 나누어진 상태입니다. 새로운 종이를 구할 수 없는 상태이기 때문에, 이 종이에서 원래 종이의 가로, 세로 방향과 평행하게 1cm × 1cm로 잘라 사용할 수 있는 만큼만 사용하기로 하였습니다.
가로의 길이 W와 세로의 길이 H가 주어질 때, 사용할 수 있는 정사각형의 개수를 구하는 solution 함수를 완성해 주세요.
2. 제한사항
- W, H : 1억 이하의 자연수
3. 입출력예
W | H | result |
8 | 12 | 80 |
입출력 예 #1
가로가 8, 세로가 12인 직사각형을 대각선 방향으로 자르면 총 16개 정사각형을 사용할 수 없게 됩니다. 원래 직사각형에서는 96개의 정사각형을 만들 수 있었으므로, 96 - 16 = 80 을 반환합니다.
4. 풀이(과정 or 최종)
Solution 1
class Solution {
public long solution(int w, int h) {
long width = Long.valueOf(w);
long height = Long.valueOf(h);
// 최대공약수 구하기 - 1
long min = Math.min(width, height);
long gcb = 0;
for(long i=1; i <= min; i++){
if(width % i == 0 && height % i == 0){
gcb = i;
}
}
// 공식 : 전체 사각형 갯수 - ((높이 + 길이)-최대공약수)
return (width*height) - ((width+height)-gcb);
}
}
Solution 2 (Solution 1 개선)
class Solution {
public long solution(int w, int h) {
long width = Long.valueOf(w);
long height = Long.valueOf(h);
// 최대공약수 구하기 - 2
long big = Math.max(width,height);
long small = Math.min(width,height);
while ( small != 0 ) {
long nmg = big % small ;
big = small;
small = nmg;
}
// 공식 : 전체 사각형 갯수 - ((높이+길이)-최대공약수))
return (width*height) - ((width+height)-big);
}
}
5. 풀이 설명
나 진짜 열심히 그림그리고 숫자란 숫자는 다 구해봤는데 공식을 찾지 못했었다.ㅜ
- 사각형을 대각선으로 잘랐을때 영향을 받는 블록이 [W+H -최대공약수] 만큼이라는걸 도대체 어떻게 생각하는걸까?
- int로 계산해서 마지막에 long type으로 바꾸면 틀린다.
- 최대 공약수를 어떻게 구하느냐에 따라 확실히 성능개선이 되었다.!
공식 풀이 예시 ) W = 8 H = 12
W = 8 H = 12 중 반복되는 대각선이 나오는 구간 : W=2 H=3
- 대각선으로 자르면 가로만큼가고 세로만큼 가기때문에 W+H를 해주고 ( W + H = 5 )
- 가로로 갈때랑 세로로 갈때 시작점이 똑같기 떄문에 중복이라서 -1을 해준단다!!!! ( 5 - 1 = 4 개가 망가졌다.!!)
- 이런 패턴이 몇개있는지를 구해야 하는데, 이러한 패턴은 최대공약수 만큼 나온다고 한다.
- W = 8 H = 12 일때 최대공약수 = 4 => 4번 반복된다.
6. 결과
Solution 1
Solution 2
7. 마치며..
수학문제.. 앞으로 이런문제가 나오면 최대공약수 최소공배수 싹 다 구해볼것이다.!!!
'공부 > 알고리즘' 카테고리의 다른 글
[프로그래머스] 짝지어 제거하기 (0) | 2022.05.25 |
---|---|
[프로그래머스] 모의고사 (0) | 2022.05.24 |
[프로그래머스] 크레인 인형뽑기 게임 (0) | 2022.05.16 |
[프로그래머스] 거리두기 확인하기 (0) | 2022.05.03 |
[BFS] 게임 맵 최단거리 (0) | 2022.04.25 |
댓글