* ๊ณต๋ถ๋ฅผ ํ๋ฉฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ์์ ํ ์ ์ด ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์.
์ ํ(Selection) ๋ฌธ์
์ฃผ์ด์ง ์๋ค ์ค k ๋ฒ์งธ๋ก ์์ ์๋ฅผ ์ฐพ์์ผ ํ๋ ๋ฌธ์ ๋ ๊ฝค๋ ์์ฃผ ๋ฑ์ฅํ๋ค. ์ค์ ๋ก ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ๋ ๊ฐ๋จํ ๊ฒ์ด ๋ง๋ค. ์๋ฅผ ๋ค์ด ์ต์ ์ซ์๋ฅผ k๋ฒ ์ฐพ๋ ๋ฐฉ๋ฒ, ์ซ์๋ฅผ ์ ๋ ฌํ๊ณ k๋ฒ์งธ ์ซ์๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ ๋ฑ์ด ์๋ค.
ํ์ง๋ง, ์์ ๋งํ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํด๋ณด์. ๊ฐ๊ฐ ์ต์ ์ ๊ฒฝ์ฐ O(kn)๊ณผ O(nlogn)์ด ์์๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ณด๋ค ๋ ํจ์จ์ ์ธ ์๊ฐ์ผ๋ก k ๋ฒ์งธ ์์ ์๋ฅผ ์ฐพ์ ์ ์์๊น? ์ฌ๊ธฐ์ ์์ด ์ฐ๋ฆฌ๋ "Selection" ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋ค.
๋ฏธ๋ฆฌ ๋งํ์๋ฉด ์ ํ(Selection) ์๊ณ ๋ฆฌ์ฆ์ ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋งค์ฐ ์ ์ฌํ๋ค. ์ด์ง ํ์์ ์ํ๋ ์๋ฅผ ์ฐพ๊ธฐ ์ํด์ ๋ถํ ์ ํ๊ณ , ์ ํ ์๊ณ ๋ฆฌ์ฆ์ k๋ฒ์งธ ์์ ์๋ฅผ ์ฐพ๊ธฐ ์ํด์ ํผ๋ด์ผ๋ก ๋ถํ ํ๋ค. ๊ฒฐ๊ตญ, ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋์ด ๋ฌด์ธ๊ฐ์ ํ๋ ๊ฒ์ ๋์ผํ๋ค๋ ๊ฒ์ด๋ค.
๋จ, ์ด์ง ํ์์ ๋ถํ ์ 1/2๋ก ๋ถํ ํ๋ฉฐ, ์ ๋ ฌ์ด ๋์ด ์๋ค. ๋ฐ๋ฉด ์ ํ ๋ฌธ์ ๋ ์ ๋ ฅ์ด ์ ๋ ฌ๋์ด ์์ง ์๊ณ ํต์ ๋ ฌ๊ณผ ๊ฐ์ด ํผ๋ด์ ๊ธฐ์ค์ผ๋ก ๋ถํ ํ๋ค.
์ ํ(Selection) ๋ฌธ์ ์ ์๋ ์ฝ๋(Pseudo Code)
๋ค์์ Selection ๋ฌธ์ ์ ๋ํ ์๋ ์ฝ๋์ด๋ค. ํต์ ๋ ฌ๊ณผ ๋ง์ด ๋น์ทํด์ ํฌ๊ฒ ์ด๋ ต์ง๋ ์์ ๊ฒ์ด๋ค.
Selection(A, left, right, k)
์ ๋ ฅ : A[left] ~ A[right]์ k, ๋จ 1<=k<=|A|, |A| = right - left + 1
์ถ๋ ฅ: A[left] ~ A[right]์์ k๋ฒ์งธ ์์ ์์
partition(A, left, right) ๊ณผ์ (์๋ 1~3๊ณผ์ )
1. ํผ๋ด(Pivot)์ A[left] ~ A[right]์์ ๋๋คํ๊ฒ ์ ํํ๋ค.
2. A[left]์ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๊ณ , ํผ๋ด๊ณผ ๊ฐ ๋ฐฐ์ด์ ์์๋ฅผ ๋น๊ตํ๋ค.
3. ํผ๋ด๋ณด๋ค ์์ ๊ฐ์ A[left] ~ A[p-1]๋ก ์ฎ๊ธฐ๊ณ , ํผ๋ด๋ณด๋ค ํฐ ๊ฐ์ A[p+1] ~ A[right]๋ก ์ฎ๊ธด๋ค. ํผ๋ด์ A[p]์ ๋๋ค.
S = (p-1) - left + 1 // small group์ ํฌ๊ธฐ
if (k <= S) Selection(A, left, p-1, k) // small group์์ ์ฐพ๊ธฐ
else if (k = S+1) return A[p] // ํผ๋ด = k ๋ฒ์งธ ์์ ์ซ์.
else Selection(A, p+1, right, k-S-1) // large group์์ ์ฐพ๊ธฐ
๐ฒ S = (p-1) - left + 1
p๋ ํผ๋ฒ์ ๋ปํ๊ณ , p-1์ small group์ ์ ์ผ ์ค๋ฅธ์ชฝ ๊ฐ์ด๋ค. -left + 1์ ํด์ฃผ์ด ๊ทธ ํฌ๊ธฐ๋ฅผ ๊ตฌํ ์ ์๋ค.
๐ฒ large group์์ k-S-1์ ํด์ฃผ๋ ์ด์
k๋ ํ์ฌ ์ฐพ๊ณ ์ ํ๋ k๋ฒ์งธ ํฐ ์์ด๋ฉฐ, -S๋ฅผ ํด์ฃผ์ด small group ์์ฒด๋ฅผ ๋นผ์ค๋ค. 1์ ํผ๋ด ๊ฐ์ ์๋ฏธํ๋ค.
์ฆ, large group์์์ ์ฐพ๊ณ ์ํ๋ k๋ฒ์งธ ํฐ ์๋ฅผ ์ฐพ๊ธฐ ์ํด ์์ฑํด ์ค ๊ฒ์ด๋ค.
Selection ์๊ณ ๋ฆฌ์ฆ(Java)
public class Selection {
public static int partition(int S[], int first, int last) {
int i, j, temp;
i = first + 1;
j = last;
while(i <=j) {
if (S[i] <= S[first]) i = i+1;
else if (S[j] > S[first]) j = j-1;
else {
temp = S[i];
S[i] = S[j];
S[j] = temp;
i = i+1;
j = j-1;
}
}
temp = S[first];
S[first] = S[j];
S[j] = temp;
return j;
}
public static int selection(int[] A, int first, int last, int k) {
int p, S;
p = partition(A, first, last);
S = (p-1) - first + 1;
if (k <= S)
return selection(A, first, p-1, k);
else if (k == S+1) return A[p];
else
return selection(A, p+1, last, k-S-1);
}
public static void main(String[] args) {
int A[] = { 48, 12, 70, 38, 75, 67, 96, 52, 81 };
int k = 5;
System.out.println(k + "๋ฒ์งธ๋ก ์์ ์์ : " + selection(A, 0, A.length - 1, k));
}
}
์์ ์ค๋ช ํ ์๋ ์ฝ๋์ ๋ณ ๋ค๋ฅผ ๊ฒ ์๋ค. ๋์ random ํผ๋ฒ์ ๊ฐ์ first ๊ฐ์ผ๋ก ๊ณ ์ ์์ผ ์ฃผ์๋ค.
Closest Pair(์ต๊ทผ์ ์ ์ ์) ๊ตฌํ๊ธฐ
x์ y ์ขํ ๊ฐ์ด ์ฃผ์ด์ง ์ฌ๋ฌ ๊ฐ์ ์ ๋ค ์ค ๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ์ ๋ค๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๊ฒ์ด ๋ชฉ์ ์ธ ๋ฌธ์ ์ด๋ค. ๋ฌผ๋ก ๊นก์ผ๋ก๋ ๊ตฌํํ ์ ์๋ค. n๊ฐ์ ์ ๋ค์ด ์ฃผ์ด์ก๋ค๊ณ ํ ๋, ๊ทธ ์ค 2๊ฐ์ ๊ธธ์ด๋ฅผ ์ ๋ถ ๊ตฌํด ๋น๊ตํ๋ฉด ๊ทธ๋ง์ด๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง n๊ฐ ์ค์์ 2๊ฐ๋ฅผ ๋ฝ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธํด์ผ ํ๊ธฐ์ O(n^2)์ ์๊ฐ ๋ณต์ก๋๊ฐ ์์๋๋ค.
๊ฒฐ๊ตญ์ ์๊ฐ ๋ณต์ก๋๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ "๋ถํ ์ ๋ณต" ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๊ฒ์ด๋ค. n๊ฐ์ ์ ์ ๋ฐ์ผ๋ก ๋ถํ ํ๊ณ , ๊ฐ ๋ถ๋ถ๋ฌธ์ ์์ ์ต๊ทผ์ ์ ์ ์์ ์ฐพ์ ์งง์ ์ ์ ์์ ํ๋ํด์ผ ํ๋ค.
์ง๊ธ๊น์ง ๋ฐฐ์ด "๋ถํ ์ ๋ณต"์ ์๋ฏธ๋ฅผ ์ฝ๋ ์์ญ์์ ์๊ฐํด๋ณด๋ฉด, ์ฌ๊ท์ ์ผ๋ก ์์ญ์ด ๋ถ๋ถํ๋๋ฉฐ ๊ฒฐ๊ตญ์ ์ ์ผ ์์ ๋ถ๋ถ์ด ๋ ๋๊น์ง ํ๊ณ ๋ค์๋ค. ์ดํ์ ๊ฐ์ฅ ์์ ๋ถ๋ถ์์ ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ๊ฒ๋ค์ ์ฌ๊ท ํจ์๋ฅผ ๋น ์ ธ๋๊ฐ๋ฉฐ "๋ณํฉ"ํ๋ ๊ณผ์ ์ ๊ฑฐ์ณค๋ค.
์ฆ, ์ต๊ทผ์ ์ ์ ์์ ๊ตฌํ๋ ๋ฌธ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ์์ญ์ด ๊ฐ์ฅ ์์ ๋ถ๋ถ์ด ๋ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํ๊ณ ๋ค์ด์ผ ํ๋ค. ๊ฐ์ฅ ์์ ๋ถ๋ถ์์๋ ์ ์ ๊ฑฐ๋ฆฌ๋ง ๊ตฌํ๋ฉด ๋๋ ๋น๊ต์ ๊ฐ๋จํ ์์ ์ด ๊ธฐ๋ค๋ฆฌ๊ณ ์์ ๊ฒ์ด๋ค. ๊ทธ ํ์ "๋ณํฉ"์ ๊ณผ์ ์์ ํด๋น ๊ฑฐ๋ฆฌ์ ๊ฐ์ด ์ต์์ธ์ง ๊ฒ์ฆํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
๋ญ ๊ทธ๋ฅ "๋ถํ ์ ๋ณต"์ ์์ฉ ๋ฒ์ ์๋์ผ? ๋ผ๊ณ ์๊ฐ์ด ๋ค ์ ์๋ค. ํ์ง๋ง ์ด ๋ฌธ์ ์์ ์ ๋๋ก ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ๋ฐ๋ก ์๋ค. ๋ฐ๋ก ์์ญ๊ณผ ์์ญ ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ด๋ค.
์ต๊ทผ์ ์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ ์ขํ๋ค๋ก ์ด๋ฃจ์ด์ง 2์ฐจ์ ํ๋ฉด์ด๋ผ๋ ๊ฒ์ ๋ค์ ํ๋ฒ ์๊ฐํด๋ณด์. 2์ฐจ์ ํ๋ฉด์์ ์ผ์ชฝ ๋ถ๋ถ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ์ ์ ๊ฐฏ์๊ฐ ๋์ผํด์ง๋๋ก ๋ฐ์ผ๋ก ๋๋์์ ๋, ์ค๊ฐ ์์ญ์ ์๊ธธ ์ ๋ฐ์ ์๋ค. ์ด๋ ๋ ์์ญ์ ๋์์ ์ํ๋ ์ ์ ์๋ค๊ณ ์ฌ๊ฒผ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด ์ผ์ชฝ ์์ญ๊ณผ ์ค๋ฅธ์ชฝ ์์ญ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ง ๋น๊ตํ๋ฉด ๋๋๋ ๊ฒ์ด ์๋๋ค. ์ฐ๋ฆฌ๋ ์ค๊ฐ ์์ญ๋ ํ์ธํด ์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋๋ง ๋คํ์ธ ์ ์ ์ผ์ชฝ ์์ญ๊ณผ ์ค๋ฅธ์ชฝ ์์ญ์์ ๊ตฌํ ๊ฐ์ฅ ์งง์ ์์ ๊ธธ์ด๋ณด๋ค๋ ํด ์ ์์ผ๋ฏ๋ก, ์ด๋์ ๋ ๋ฒ์๋ฅผ ์ง์ ํด ์ฃผ๋ฉด๋๋ค. ์๋ ๊ทธ๋ฆผ์ ํ๋ฒ ๋ณด์.
์ฐ๋ฆฌ๊ฐ ์ค๊ฐ ์์ญ์์ ํ์ธํด ์ค ์ ์ ์ ๋ชจ๋ ์ ์ด ์๋๋ค. ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ผ์ชฝ ์์ญ์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ ์์ d๋งํผ ๋บ ๊ฑฐ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ ์์ญ์์ ๊ฐ์ฅ ์ผ์ชฝ ์ ์์ d๋งํผ ๋ํ ๊ฑฐ๋ฆฌ์์ ์ํ๋ ์ ๋ค์ ํ์ธํ๋ฉด ๊ทธ๋ง์ด๋ค.
์กฐ๊ธ ๊ฐ๋ณ๊ฒ ์๊ฐํด๋ณด์. ์ผ์ชฝ ์์ญ ์ต์, ์ค๋ฅธ์ชฝ ์์ญ ์ต์, ์ค๊ฐ ์์ญ ์ต์ ์ค ๊ฐ์ฅ ์์ ๊ฐ์ ๊ตฌํ๋ฉด๋๋ค. ์ด ๋ ์ค๊ฐ ์์ญ์ ์ต์๋ฅผ ๊ตฌํ ๋ ์กฐ๊ธ ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํ๊ณ ์ ์ฝ๊ฐ์ ํธ๋ฆญ์ ์ฌ์ฉํ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๊ธฐ๋ ํ๋ค.
๊ทธ๋ฌ๋ฉด ์ค๊ฐ ์์ญ์์๋ ์ด๋ป๊ฒ ์ต์ ๊ฐ์ ๊ตฌํ ๊ฒ์ธ๊ฐ? ์ด ๋ถ๋ถ์ ๋ํด์ ์ฐ๋ฆฌ๋ "์ ๋ ฌ"์ ์ฌ์ฉํ ๊ฒ์ด๋ค. y์ถ์ผ๋ก ์ ๋ ฌ๋ ๋ชจ๋ ์ ๋ค์ ๋ํ ๋ฐฐ์ด์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํด๋ณด์. ๊ทธ ์์ญ์์ ์ค๊ฐ ์์ญ์ ํด๋น๋๋ ์ ๋ง ๋ฐ๋ก ๋ณด๊ดํ๋ค๊ณ ํ์ ๋, ๋น๊ต ํ์๋ ๋์ ๋๊ฒ ์ ์ด์ง๋ค.
์๋ฅผ ๋ค์ด, ์ค๊ฐ ์์ญ์ ์ํ๋ ์ผ์ชฝ ์์ญ๊ณผ ์ค๋ฅธ์ชฝ ์์ญ์ ์ํ ์ ๋ค์ ๋น๊ตํ ๋, ์ผ์ชฝ ์์ญ์ ์ํ๋ 1๋ฒ ์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํ๊ธฐ ์ํด์, 1-2, 1-3, 1-4... ์ ๊ฐ์ ์์ผ๋ก ์ ๋ถ ๋น๊ตํด ์ฃผ์ด์ผ ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์ ์ ์์๋ค.
ํ์ง๋ง, "์ ๋ ฌ" ์ด๋ผ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด๋จ๊น? ๋น๊ตํด์ผ ํ ์ ๋ค์ด y์ถ์ผ๋ก ์ ๋ ฌ๋์ด ์๊ธฐ์ 1-2, 2-3, 3-4 ์ ๊ฐ์ด ๊ฐ์ ์ต์์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์งํ๋ค. ์ฆ, ์ ๋ ฌ๋ง ํ๋ค๋ฉด O(1)์ ์๊ฐ์ผ๋ก ๋น๊ต์ ์ฝ๊ฒ ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ์ ์๋ค.
Closest Pair(์ต๊ทผ์ ์ ์ ์)์ ์๋ ์ฝ๋(Pseudo code)
ClosestPair(S)
์ ๋ ฅ : x-์ขํ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด S์ ์๋ i ๊ฐ์ ์ . ๋จ, ๊ฐ ์ ์ (x, y)๋ก ํํํ๋ค.
์ถ๋ ฅ : S์ ์๋ ์ ๋ค ์ค ์ต๊ทผ์ ์ ์ ์์ ๊ฑฐ๋ฆฌ
if (i <= 3) return (2 ๋๋ 3๊ฐ์ ์ ๋ค ์ฌ์ด์ ์ต๊ทผ์ ์)
์ ๋ ฌ๋ S๋ฅผ ๊ฐ์ ํฌ๊ธฐ์ Sl๊ณผ Sr๋ก ๋ถํ ํ๋ค. |S|๊ฐ ํ์์ด๋ฉด, |Sl| = |Sr| + 1์ด ๋๋๋ก ๋ถํ ํ๋ค.
Cpl = ClosestPair(Sl)
Cpr = ClosestPair(Sr)
d = min{dist(Cpl), dist(Cpr)} ์ผ ๋, ์ค๊ฐ ์์ญ์ ์ํ๋ ์ ๋ค ์ค์์ ์ต๊ทผ์ ์ ์ ์์ ์ฐพ์์ ์ด๋ฅผ Cpc๋ผ๊ณ ํ์. ๋จ, dist()๋ ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋งํ๋ค.
return (Cpl, Cpr, Cpc ์ค์์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ์)
๋ค์์ ํด๋น ์๋์ฝ๋๋ฅผ ๊ตฌํํ Java ์ฝ๋ ์์์ด๋ค.
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class CloseSet {
static List<List<Integer>> pointsCopy;
// ๋ถํ ์ ๋ณต ์ํํ๋ ํจ์
static List<List<Integer>> closestPair(List<List<Integer>> points, int low, int high) {
int size = high - low + 1;
List<List<Integer>> result = new ArrayList<>();
// ์ฌ์ด์ฆ๊ฐ 2์ผ ๋๋ ๊ทธ๋ฅ result์ ์ถ๊ฐ
if (size == 2) {
result.add(points.get(low));
result.add(points.get(high));
return result;
}
// ์ฌ์ด์ฆ๊ฐ 3์ผ ๋๋ 3๊ฐ์ ๊ฑฐ๋ฆฌ ์ค ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ result์ ์ถ๊ฐ
if (size == 3) {
double dist1 = dist(points.get(low), points.get(low + 1));
double dist2 = dist(points.get(low), points.get(high));
double dist3 = dist(points.get(low + 1), points.get(high));
if (dist1 <= dist2 && dist1 <= dist3) {
result.add(points.get(low));
result.add(points.get(low + 1));
} else if (dist2 <= dist1 && dist2 <= dist3) {
result.add(points.get(low));
result.add(points.get(high));
} else {
result.add(points.get(low + 1));
result.add(points.get(high));
}
return result;
}
int mid = size / 2 + low - 1;
List<List<Integer>> leftPair = closestPair(points, low, mid);
List<List<Integer>> rightPair = closestPair(points, mid + 1, high);
// ์ผ์ชฝ ์์ญ๊ณผ ์ค๋ฅธ์ชฝ ์์ญ์ ์ต์ ๊ฑฐ๋ฆฌ ์ค ๋ ์์ ๊ฒ์ d๋ก ์ ์ธ
double d = Math.min(dist(leftPair.get(0), leftPair.get(1)), dist(rightPair.get(0), rightPair.get(1)));
// ์๋ ์ ๋ค์์ +/-d ๋ฅผ ํ ์์ญ
List<List<Integer>> strip = new ArrayList<>();
// ์ผ์ชฝ ์์ญ์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์
int leftX = points.get(mid).get(0);
// ์ค๋ฅธ์ชฝ ์์ญ์ ๊ฐ์ฅ ์ผ์ชฝ ์
int rightX = points.get(mid + 1).get(0);
for (List<Integer> point : pointsCopy) {
int x = point.get(0);
if (x >= leftX - d && x <= rightX + d) {
strip.add(point);
}
}
double centerDist = Double.POSITIVE_INFINITY;
List<Integer> centerPoint1 = null;
List<Integer> centerPoint2 = null;
// ๋ ์ ์ฉ๋ง ๋น๊ตํ๋ฉด๋จ(์ด๋ฏธ y์ถ์ผ๋ก ์ ๋ ฌ๋์๊ธฐ ๋๋ฌธ)
for (int i = 0; i < strip.size() - 1; i++) {
List<Integer> p1 = strip.get(i);
List<Integer> p2 = strip.get(i + 1);
double currentDist = dist(p1, p2);
if (currentDist < centerDist) {
centerDist = currentDist;
centerPoint1 = p1;
centerPoint2 = p2;
}
}
// ์ค์์์ ๊ตฌํ ๊ฑฐ๋ฆฌ๊ฐ ํ์ฌ๊น์ง์ ๊ฑฐ๋ฆฌ๋ณด๋ค ์งง๋ค๋ฉด ๊ฐฑ์
if (centerPoint1 != null && centerPoint2 != null && centerDist < d) {
result.add(centerPoint1);
result.add(centerPoint2);
return result;
}
return d == dist(leftPair.get(0), leftPair.get(1)) ? leftPair : rightPair;
}
// ๋ ์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ ํจ์
static double dist(List<Integer> p, List<Integer> q) {
int deltaX = p.get(0) - q.get(0);
int deltaY = p.get(1) - q.get(1);
return Math.sqrt(deltaX * deltaX + deltaY * deltaY);
}
public static void main(String[] args) {
int N = 20;
List<List<Integer>> points = new ArrayList<>();
Random random = new Random(System.currentTimeMillis());
for (int i = 0; i < N; i++) {
int x = random.nextInt(201); // 0๋ถํฐ 200๊น์ง์ ๋๋ค x ์ขํ
int y = random.nextInt(101); // 0๋ถํฐ 100๊น์ง์ ๋๋ค y ์ขํ
List<Integer> point = new ArrayList<>();
point.add(x);
point.add(y);
points.add(point);
}
// x ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ค์ ์ ๋ ฌ
points.sort((p1, p2) -> Integer.compare(p1.get(0), p2.get(0)));
for (int i = 0; i < N; i++) {
points.get(i).add(i);
}
System.out.print("[");
for(int i=0; i<N; i++) {
if (i != N-1) {
System.out.print("[" + points.get(i).get(0) + ", " + points.get(i).get(1) + ", " +points.get(i).get(2) + "], ");
} else {
System.out.print("[" + points.get(i).get(0) + ", " + points.get(i).get(1) + ", " +points.get(i).get(2) + "]");
}
}
System.out.print("]");
pointsCopy = new ArrayList<>(points);
pointsCopy.sort((p1, p2) -> Integer.compare(p1.get(1), p2.get(1)));
List<List<Integer>> result = closestPair(points, 0, points.size() - 1);
System.out.println();
System.out.println("================================================");
System.out.print("[");
for(int i=0; i<N; i++) {
if (i != N-1) {
System.out.print("[" + pointsCopy.get(i).get(0) + ", " + pointsCopy.get(i).get(1) + ", " +pointsCopy.get(i).get(2) + "], ");
} else {
System.out.print("[" + pointsCopy.get(i).get(0) + ", " + pointsCopy.get(i).get(1) + ", " +pointsCopy.get(i).get(2) + "]");
}
}
System.out.print("]");
System.out.println();
System.out.println("================================================");
System.out.println("๋ถํ ์ ๋ณต ํด = \t" + result.get(0) + " \t" + result.get(1) + " \t" + String.format("%.2f", dist(result.get(0), result.get(1))));
double closestDist = Double.MAX_VALUE;
List<Integer> closestPoint1 = null;
List<Integer> closestPoint2 = null;
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
double currentDist = dist(points.get(i), points.get(j));
if (currentDist < closestDist) {
closestDist = currentDist;
closestPoint1 = points.get(i);
closestPoint2 = points.get(j);
}
}
}
System.out.println("N^2 ํด = \t" + closestPoint1 + " \t" + closestPoint2 + " \t" + String.format("%.2f", closestDist));
System.out.println(closestDist == dist(result.get(0), result.get(1)));
}
}