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
- 세그먼트 트리
- 에라토스테네스의 체
- 투 포인터
- mst
- 문자열
- 프로그래머스
- Kotlin
- 구현
- 완전탐색
- java
- 백트래킹
- 수학
- 스택
- BFS
- 위상정렬
- 알고리즘
- swea
- CS
- JUnit 5
- 플로이드-와샬
- 동적계획법
- 시뮬레이션
- 백준
- 그리디
- 유니온 파인드
- 이분탐색
- dfs
- 후니의 쉽게 쓴 시스코 네트워킹
- Effective Java
- Network
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 |