diff --git "a/khj20006/202503/10 BOJ P4 \352\260\220\354\230\245 \352\261\264\354\204\244.md" "b/khj20006/202503/10 BOJ P4 \352\260\220\354\230\245 \352\261\264\354\204\244.md" new file mode 100644 index 00000000..f2e5797d --- /dev/null +++ "b/khj20006/202503/10 BOJ P4 \352\260\220\354\230\245 \352\261\264\354\204\244.md" @@ -0,0 +1,116 @@ +```java + +import java.util.*; +import java.io.*; + +class Point{ + int x,y,id; + Point(int x, int y, int id){ + this.x = x; + this.y = y; + this.id = id; + } + + // this -> a -> b CCW + // 1 : CCW, 0 : line, 1 : CW + int ccw(Point a, Point b) { + long res = (long)a.x * b.y + (long)b.x * this.y + (long)this.x * a.y - ((long)b.x * a.y + (long)this.x * b.y + (long)a.x * this.y); + if(res == 0) return 0; + return res > 0 ? 1 : -1; + } + boolean isInPolygon(List A) { + if(A.size() < 3) return false; + boolean res = true; + for(int i=0;i { + if(a.x == b.x) return a.y-b.y; + return a.x-b.x; + }); + for(int i=0;i lower = new ArrayList<>(); + List upper = new ArrayList<>(); + for(int i=0;i 1 && walls[i].ccw(lower.get(lower.size()-2), lower.get(lower.size()-1)) <= 0) lower.remove(lower.size()-1); + while(upper.size() > 1 && walls[i].ccw(upper.get(upper.size()-2), upper.get(upper.size()-1)) >= 0) upper.remove(upper.size()-1); + lower.add(walls[i]); + upper.add(walls[i]); + } + + List convexHull = new ArrayList<>(); + for(int i=0;i0;i--) { + used[upper.get(i).id] = true; + convexHull.add(upper.get(i)); + } + + + return prison.isInPolygon(convexHull); + + } + +} + +```