SWEA/D3
[SWEA] - 7227. 사랑의 카운슬러 (D3)
0으하하0
2022. 5. 16. 22:18
[문제]
오훈이에게는 지렁이 친구 N마리가 있다. 오훈이는 지렁이들을 위해 소개팅을 주선하고자 한다.
주선 방법은 임의의 지렁이 두 마리를 매칭시킨 후 한 지렁이에게 다른 지렁이가 있는 곳으로 가도록 하는 것이다.
이 때, 수학을 좋아하는 오훈이는 가능한 지렁이들이 움직인 벡터 합의 크기가 작기를 바란다.
지렁이들은 2차원 평면 안에서 꿈틀거리고 있는데,
지렁이들이 움직인 벡터를 나타내는 방법은 점 A 위에 있는 지렁이가 점 B 위에 있는 지렁이에게 갔다면,
그 벡터는 점 A에서 점 B를 가리키는 벡터가 된다.
벡터 V=(x, y)의 크기는 다음과 같이 정의하자.
│V│=│(x, y)│= x * x + y * y
모든 지렁이들을 매칭시키고 소개팅을 주선하되, 각 지렁이들이 움직인 벡터를 합하여 그 크기가 최소가 되도록 하라.
[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 정수 N(2 ≤ N ≤ 20, N은 짝수) 가 주어진다.
두 번째 줄 N개의 줄에는 지렁이들이 존재하는 점의 좌표가 주어진다.
모든 좌표 값은 절대값이 100,000보다 작거나 같은 정수다. 지렁이들은 모두 서로 다른 위치에 있다.
[출력]
각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,
지렁이의 움직인 벡터의 합의 크기의 최소값을 출력하라.

문제 풀기
7227. 사랑의 카운슬러
[풀이]
- 두 마리의 지렁이끼리 매칭을 시켜줘야 하므로 조합을 이용하여 풀이
- 전체 지렁이 수의 절반까지 골랐다면 선택된 지렁이가 선택되지않은 지렁이의 방향으로 가는 것이므로
백터의 합 = (선택된 지렁이들의 좌표 합) - (선택되지 않은 지렁이들의 좌표 합) 이 된다.
import java.util.Scanner;
class Solution {
public static int n;
public static long min;
public static int[][] arr;
public static boolean[] visit;
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int tc=1; tc<=t; tc++) {
n = sc.nextInt();
arr = new int[n][2];
visit = new boolean[n];
min = Long.MAX_VALUE;
for(int i=0; i<n; i++) {
arr[i][0] = sc.nextInt();
arr[i][1] = sc.nextInt();
}
combination(0, 0);
System.out.format("#%d %d\n", tc, min);
}
}
public static void combination(int cnt, int start) {
if(cnt == n/2) {
long dx = 0;
long dy = 0;
for(int i=0; i<n; i++) {
// 선택된 지렁이(출발지점)
if(visit[i]) {
dx += arr[i][0];
dy += arr[i][1];
}
// 선택안된 지렁이(도착지점)
else {
dx -= arr[i][0];
dy -= arr[i][1];
}
}
long vector = (dx * dx) + (dy * dy);
min = Math.min(min, vector);
return;
}
for(int i=start; i<n; i++) {
visit[i] = true;
combination(cnt+1, i+1);
visit[i] = false;
}
}
}