728x90
그려서 겨우 풀었지만, 너무 와닿지 않는다.
*문제를 눈으로 풀지 말것*
더보기
using namespace std;
int gcd(int x, int y){
if(y == 0) return x;
else if(x == 0) return y;
return gcd(x%y, y%x);
}
long long solution(int w,int h) {
if(w == h) return (long long) w*(h-1);
int gcd_val = gcd(w, h);
int deleted = h/gcd_val + w/gcd_val - 1;
long long answer = (long long)w*h - deleted*gcd_val;
return answer;
}
문제
https://programmers.co.kr/learn/courses/30/lessons/62048
코딩테스트 연습 - 멀쩡한 사각형
가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을
programmers.co.kr
728x90
[접근 1]
gcd 구하기: 유클리드 algorithm (이산수학 시간에 배웠던것같다)
어차피 나머지이기 때문에, 큰 값으로 작은 값을 나누면 작은값은 그대로 남는다.
따라서 작은값 큰 값 구별 없이 그냥 나머지 구해주면 된다.
(그런데 다른 사람들은 이렇게 하지 않았음)
int gcd(int x, int y){
if(y == 0) return x;
else if(x == 0) return y;
return gcd(x%y, y%x);
}
x와 y 위치를 바꿔서 넣어주면 x위치에 있는 값만 0인지 확인해주면되고,
y만 x로 나눈 나머지를 구해주면 된다.
int gcd(int x, int y){
if(x == 0) return y;
return gcd(y%x, x);
}
OR
int gcd(int x, int y){
return x? gcd(y%x, x): y;
}
[접근 2]
만약 w와 h가 같으면 그냥 height에서 1뺀 넓이를 구해서 return 해주면 된다.
if(w == h) return (long long) w*(h-1);
[접근 3]
그게 아니면 좀 구해야할 것이 있는데, w와 h의 gcd를 구해준다.
작은 직사각형 내에서 지워지는 사각형의 개수는 왼쪽에서 봤을때, h/gcd_val만큼 지워지고, 위에서 봤을때, w/gcd_val만큼 지워지는데, 왼쪽 위 모서리가 두번 카운트 되므로 1만큼 빼준 값이 지워진다.
따라서 답은 전체 넓이에서 작은 직사각형 내에서 지워지는 사각형의 수 곱하기 gcd 값이 된다.
int gcd_val = gcd(w, h);
int deleted = h/gcd_val + w/gcd_val - 1;
long long answer = (long long)w*h - deleted*gcd_val;
return answer;728x90
'coding > algorithm' 카테고리의 다른 글
| [SW Expert Academy] D2 1204. 최빈수 구하기(c++) (0) | 2022.05.19 |
|---|---|
| [programmers] Lv.2 멀쩡한 사각형(c++) - 2nd (0) | 2022.05.18 |
| [SW Expert Academy] D2 1859. 백만 장자 프로젝트(c++) (0) | 2022.05.18 |
| [SW Expert Academy] D1 2072. 홀수만 더하기(c++) (0) | 2022.05.18 |
| [SW Expert Academy] D3 1206. View(c++) (0) | 2022.05.18 |
댓글