본문 바로가기

ProgramSoliving

백준 : 2116 자바

반응형

https://www.acmicpc.net/problem/2166

 

2166번: 다각형의 면적

첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.

www.acmicpc.net

ccw 세점의 외적을 이용하여 삼각형의 넓이를 구할 수 있다.

 

주어진 다각형의 좌표들은 순서대로 주어지기때문에 ccw의 값자체의  /2 한값이 삼각형이란걸 알수있다.

다각형을 삼각형으로 나누엇을때  값을 구할수 있다.

 

소스코드

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package algo;
 
import java.util.Scanner;
 
public class B2166 {
    static int N;
 
    static class Pair {
        long y;
        long x;
 
        public Pair(long x, long y) {
            super();
            this.y = y;
            this.x = x;
        }
    }
 
    static long ccw(Pair a, Pair b, Pair c) {
        long op = a.x * b.y + b.x * c.y + c.x * a.y;
        op -= (a.y * b.x + b.y * c.x + c.y * a.x);
 
        // 반시계 방향
        if (op > 0)
            return op;
        // 평행
        else if (op == 0)
            return 0;
        // 시계 방향
        else
            return op;
 
    }
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        N = sc.nextInt();
 
        long ans = 0L;
 
        Pair[] polygon = new Pair[N];
 
        for (int i = 0; i < N; i++) {
            polygon[i] = new Pair(sc.nextLong(), sc.nextLong());
        }
 
        for (int i = 1; i < N - 1; i++) {
            ans += ccw(polygon[0], polygon[i], polygon[i + 1]);
        }
        ans = Math.abs(ans);
        
        if(ans%2==0) {
            System.out.println((ans/2)+".0");
        }else {
            System.out.println((ans/2)+".5");
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 17387  (0) 2020.05.05
백준 : 3025 java (돌 던지기)  (0) 2020.05.04
백준 : 2113 java  (0) 2020.05.03
백준 16933: java  (0) 2020.04.30
백준 : 7682  (0) 2020.04.15