728x90
1. 문제
볼록 다각형이 있고, 여기서 3개의 연속된 점을 선택해서 삼각형을 만든다. 그 다음, 만든 삼각형을 다각형에서 제외한다. 원래 다각형이 N개의 점이 있었다면, 이제 N-1개의 점으로 구성된 볼록 다각형이 된다. 위의 과정은 남은 다각형이 삼각형이 될 때까지 반복한다.
볼록 다각형의 점이 시계 방향순으로 주어진다. 마지막에 남은 삼각형은 여러 가지가 있을 수 있다. 이때, 가능한 넓이의 최댓값을 구하는 프로그램을 작성하시오.
첫째 줄에 볼록 다각형 점의 수 N (3 ≤ N ≤ 35)이 주어진다. 둘째 줄부터 N개의 줄에는 볼록 다각형을 이루고 있는 점이 시계 방향 순서로 주어진다. 좌표는 10,000보다 작거나 같은 자연수이다.
첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.
2. 풀이
1. 좌표를 모두 points에 저장한다.
2. 선택된 세 개의 좌표를 저장하기 위한 selected 배열을 초기화한다.
3. 조합(pick 함수)으로 점 세개를 뽑은 뒤 넓이를 구해서 비교한다. 아래 공식을 활용했다.
4. 최대값을 출력한다.
import java.io.*;
import java.util.*;
public class BOJ_1198_삼각형으로자르기 {
static int N;
static double MAX = 0;
static int[][] points;
static int[][] selected;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(in.readLine());
points = new int[N][2];
StringTokenizer st;
for(int i=0;i<N;i++){
st = new StringTokenizer(in.readLine());
points[i][0] = Integer.parseInt(st.nextToken());
points[i][1] = Integer.parseInt(st.nextToken());
}
selected = new int[3][2];
pick(0,0);
System.out.println(MAX);
}
private static void pick(int cnt, int start){
if(cnt==3){
//넓이 구하기
double area = (selected[0][0]*selected[1][1]+selected[1][0]*selected[2][1]+selected[2][0]*selected[0][1])
-(selected[0][0]*selected[2][1]+selected[2][0]*selected[1][1]+selected[1][0]*selected[0][1]);
if(area<0) area *= -1;
area/=2;
//비교하기
MAX = Math.max(MAX,area);
return;
}
for(int i=start;i<N;i++){
selected[cnt] = points[i];
pick(cnt+1,i+1);
selected[cnt] = null;
}
}
}
3. 결과
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 1206 사람의 수 - JAVA (0) | 2022.06.17 |
---|---|
[BOJ] 1183 약속 - JAVA (0) | 2022.06.16 |
[BOJ] 1205 등수 구하기 - JAVA (0) | 2022.06.14 |
[BOJ] 1213 팰린드롬 만들기 - JAVA (0) | 2022.06.13 |
[BOJ] 1235 학생번호 - JAVA (0) | 2022.06.12 |
댓글