Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- CS
- 유니온 파인드
- 알고리즘
- 백준
- 시뮬레이션
- 이분탐색
- 스택
- 세그먼트 트리
- 구현
- swea
- mst
- 백트래킹
- 후니의 쉽게 쓴 시스코 네트워킹
- java
- 위상정렬
- Effective Java
- Network
- Kotlin
- 완전탐색
- 수학
- dfs
- 투 포인터
- 플로이드-와샬
- 그리디
- 프로그래머스
- BFS
- 문자열
- 동적계획법
- JUnit 5
- 에라토스테네스의 체
Archives
반갑습니다!
[프로그래머스] 멀쩡한 사각형 본문
직선의 방정식을 구해서 직선보다 y좌표 값이 작은 사각형의 개수를 구하고 2배하는 방법으로 풀어보려했지만 시간초과가 계속 발생해서 결국 방법을 바꿔서 해결한 문제이다. 규칙을 찾는게 어려운 문제였다.
풀이
잘리는 사각형의 개수를 패턴을 통해서 알 수 있다.w와 h의 최대공약수를 g라고 하면 가로가 w/g, 세로가 h/g인 패턴이 g번 반복되는 것을 알 수 있다. (아래 그림 참조)
그리고 해당 패턴 안에 잘리는 사각형을 생각해보면 w/g + h/g - 1개의 사각형이 잘린다는 것을 알 수 있다. 따라서 가능한 사각형의 총 개수는 w * h - g * (w/g + h/g - 1) 이므로 w * h - (w + h - 1)이 된다. 이 때 정답이 int 범위를 벗어나므로 주의해야한다.
코드
#include <algorithm>
using namespace std;
int gcd(int a, int b){
if(a % b == 0) return b;
return gcd(b, a%b);
}
long long solution(int w, int h)
{
long long sum = (long long)w * (long long)h;
if(w < h) swap(w, h);
int g = gcd(w, h);
return sum - (w + h - g);
}'알고리즘 문제 풀이' 카테고리의 다른 글
| [프로그래머스] 124 나라의 숫자 (0) | 2020.04.03 |
|---|---|
| [프로그래머스] 카카오 프렌즈 컬러링 북 (0) | 2020.04.03 |
| [프로그래머스] 크레인 인형뽑기 게임 (0) | 2020.04.03 |
| [프로그래머스] 문자열 압축 (0) | 2020.04.03 |
| [프로그래머스] 기능개발 (0) | 2020.04.02 |