※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 3049번 문제인 다각형의 대각선이다.
문제는 아래 링크를 확인하자.
3049번: 다각형의 대각선
세 대각선이 한 점에서 만나지 않는 볼록 N각형이 주어졌을 때, 대각선의 교차점의 개수를 세는 프로그램을 작성하시오. 아래 그림은 위의 조건을 만족하는 한 육각형의 교차점 그림이다. 모든
www.acmicpc.net
이 문제는 길이가 N인 다각형의 대각선의 교점의 개수를 세는 문제이다.
방법1) 처음에 풀어서 제출한 방법이다.
1. N각형의 꼭짓점 X를 하나 고른다. 나머지 꼭짓점을 반시계방향으로 1, 2, ... , i, ... , N-1이라 이름붙이자.
2. X와 꼭짓점 i를 잇는 대각선이 만드는 교점의 개수는 이 대각선으로 양옆으로 나뉜 점들의 개수와 같다는 것을 간단한 관찰을 통해 알 수 있다. 즉, X와 i를 잇는 대각선은 교점 (i-1) * (N-1-i) 개이다. 이를 각 꼭짓점 i마다 계산하여 더한 값을 구한다.
3. 모든 꼭짓점에 대해서 그 꼭짓점이 연결된 대각선이 포함된 교점의 개수는 2에서 구한 값과 같다. 교점마다 두 대각선의 시작점과 끝점으로 선택하는 순서를 바꾸경우가 존재하므로, 답은 (2에서 구한 값) * N / 4가 된다.
방법2) 대각선의 교점을 이루는 네개의 점의 개수를 세는 방법
잘 관찰해보면, 각 대각선의 교점과 그 교점을 이루는 두 대각선의 끝 네 점을 고르는 방법은 일대일대응이 된다. 따라서, 다각형의 대각선의 교점의수는 다각형의 꼭짓점 중 네개의 꼭짓점을 고르는 경우의 수와 같다는 것을 알 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int main()
{
long long N; cin >> N;
cout << N * (N - 1) * (N - 2) * (N - 3) / 24;
}
'BOJ' 카테고리의 다른 글
[BOJ 2437 // C++] 저울 (0) | 2021.04.19 |
---|---|
[BOJ 17481 // C++] 최애 정하기 (0) | 2021.04.18 |
[BOJ 3005 // C++] 크로스워드 퍼즐 쳐다보기 (0) | 2021.04.16 |
[BOJ 3010 // C++] 페그 (0) | 2021.04.15 |
[BOJ 9345 // C++] 디지털 비디오 디스크(DVDs) (1) | 2021.04.14 |