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 | 31 |
Tags
- 비트마스킹
- dp
- 도커
- 메모이제이션
- 이분 매칭
- 다익스트라
- Java
- 구간 트리
- 주울
- 완전 탐색
- spring boot
- 게이트웨이
- BFS
- 백트래킹
- Logback
- 구현
- 유레카
- Gradle
- Zuul
- spring cloud
- 스택
- Spring Cloud Config
- 트리
- 달팽이
- 서비스 디스커버리
- 스프링 시큐리티
- docker-compose
- 플로이드 와샬
- 이분 탐색
- ZuulFilter
Archives
- Today
- Total
Hello, Freakin world!
[백준 1004] 어린 왕자 본문
https://www.acmicpc.net/problem/1004
해결 방법
각 지점(시작, 도착)을 포함하는 원의 리스트를 구합니다. 그리고 각 리스트 원소의 합집합의 개수에서 교집합의 개수를 빼면 답이 됩니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;
/*
백준 1004번 어린왕자
https://www.acmicpc.net/problem/1004
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
List<Integer> location = Arrays.stream(br.readLine().split(" "))
.map(p -> Integer.parseInt(p))
.collect(Collectors.toList());
Point start = new Point(location.get(0), location.get(1));
Point end = new Point(location.get(2), location.get(3));
int n = Integer.parseInt(br.readLine());
List<Circle> circles = new ArrayList<>();
for (int j = 0; j < n; j++) {
String[] centerInfo = br.readLine().split(" ");
circles.add(new Circle(centerInfo));
}
List<Circle> circlesHavingStartPoint = circles.stream()
.filter(circle -> circle.hasPoint(start))
.collect(Collectors.toList());
List<Circle> circlesHavingEndPoint = circles.stream()
.filter(circle -> circle.hasPoint(end))
.collect(Collectors.toList());
Set<Circle> crossSectionCircles = crossSectionCircles(circlesHavingStartPoint, circlesHavingEndPoint);
int answer = circlesHavingStartPoint.size() + circlesHavingEndPoint.size() - 2 * crossSectionCircles.size();
System.out.println(answer);
}
}
private static Set<Circle> crossSectionCircles(List<Circle> circlesHavingStartPoint, List<Circle> circlesHavingEndPoint) {
Set<Circle> crossSectionSet = new HashSet<>();
for (Circle startCircle : circlesHavingStartPoint) {
for (Circle endCircle : circlesHavingEndPoint) {
if(startCircle.equals(endCircle)) {
crossSectionSet.add(endCircle);
}
}
}
return crossSectionSet;
}
}
class Circle {
Point center;
int r;
public Circle(String[] info) {
this.center = new Point(Integer.parseInt(info[0]), Integer.parseInt(info[1]));
this.r = Integer.parseInt(info[2]);
}
public boolean hasPoint(Point point) {
int dx = center.x - point.x;
int dy = center.y - point.y;
return r*r > (dx*dx + dy*dy);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Circle circle = (Circle) o;
if (r != circle.r) return false;
return center.equals(circle.center);
}
@Override
public int hashCode() {
int result = center.hashCode();
result = 31 * result + r;
return result;
}
}
class Point {
int x,y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
if (x != point.x) return false;
return y == point.y;
}
@Override
public int hashCode() {
int result = x;
result = 31 * result + y;
return result;
}
}
'알고리즘 > PS' 카테고리의 다른 글
[백준 1009번] 분산 처리 (0) | 2020.08.23 |
---|---|
[백준 1007번] 벡터 매칭 (0) | 2020.08.23 |
[백준 1006] 습격자 초라기 (0) | 2020.08.22 |
[백준 1786][KMP] 찾기 - while, 재귀버전 (0) | 2020.08.05 |
[백준 2941번] 크로아티아 알파벳 (0) | 2020.07.27 |
Comments