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
- 구현
- 스프링 시큐리티
- Zuul
- ZuulFilter
- 스택
- 트리
- 다익스트라
- 도커
- 서비스 디스커버리
- 완전 탐색
- 백트래킹
- BFS
- 유레카
- 달팽이
- dp
- Logback
- 주울
- spring cloud
- 이분 매칭
- 구간 트리
- 비트마스킹
- 이분 탐색
- 게이트웨이
- docker-compose
- Gradle
- Java
- spring boot
- Spring Cloud Config
- 플로이드 와샬
- 메모이제이션
Archives
- Today
- Total
Hello, Freakin world!
[백준 1007번] 벡터 매칭 본문
https://www.acmicpc.net/problem/1007
재밌는 문제네요. 좌표평면 상의 벡터합 수식을 정리하면 결국 점들을 머리방향, 꼬리방향으로 양분해 처리하는 문제로 바뀝니다.
총 20개의 점들 중 10개를 선택하는 각각의 조합에 대해 벡터의 크기를 구해 최소값을 구합니다.
좋은 글이 있어 링크를 첨부합니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/*
백준 1007 벡터 매칭
https://www.acmicpc.net/problem/1007
*/
public class Main {
static int T,N;
static double INF = 9876543210d;
static boolean[] isHead;
static List<Point> points;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// BufferedReader br = new BufferedReader(new FileReader("testcase.txt"));
T = Integer.parseInt(br.readLine());
for (int testCase = 0; testCase < T; testCase++) {
N = Integer.parseInt(br.readLine());
isHead = new boolean[N];
points = new ArrayList<>();
for (int i = 0; i < N; i++) {
String[] pointInput = br.readLine().split(" ");
int x = Integer.parseInt(pointInput[0]);
int y = Integer.parseInt(pointInput[1]);
points.add(new Point(x,y));
}
double ans = solve(0,1);
System.out.println(ans);
}
}
private static double solve(int index, int count) {
isHead[index] = true;
if(count == N/2) {
double ret = getVectorSize();
isHead[index] = false;
return ret;
}
double ret = INF;
for (int i = index+1; i < N; i++) {
if(!isHead[i]) {
ret = Math.min(solve(i, count+1), ret);
isHead[i] = false;
}
}
return ret;
}
private static double getVectorSize() {
double totalX = 0;
double totalY = 0;
for (int i = 0; i < N; i++) {
if(isHead[i]) {
totalX += points.get(i).x;
totalY += points.get(i).y;
}else {
totalX -= points.get(i).x;
totalY -= points.get(i).y;
}
}
return Math.sqrt(totalX*totalX + totalY*totalY);
}
}
class Point {
int x,y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
'알고리즘 > PS' 카테고리의 다른 글
[백준 1010번] 다리 놓기 (0) | 2020.08.23 |
---|---|
[백준 1009번] 분산 처리 (0) | 2020.08.23 |
[백준 1006] 습격자 초라기 (0) | 2020.08.22 |
[백준 1004] 어린 왕자 (0) | 2020.08.16 |
[백준 1786][KMP] 찾기 - while, 재귀버전 (0) | 2020.08.05 |
Comments