1. ํ์
์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ N๊ฐ์ ์ ์ ๋ฐฐ์ด A[0], ..., A[N-1]์ด ์๋ค. X๊ฐ ์ฃผ์ด์ก์ ๋, A[i] = X๋ผ๋ฉด i๋ฅผ ๋ฆฌํดํ๋ ํจ์ find(N, X)๋ฅผ ์์ฑํ์์ค. ์ด ํจ์๋ ๋ด๋ถ์ ์ผ๋ก compare(i, val)์ ํธ์ถํ๋๋ฐ, ์ด๋ A[i]=val์ด๋ฉด 0, A[i] < val์ด๋ฉด 1, A[i] > val์ด๋ฉด -1์ ๋ฆฌํดํ๋ ํจ์์ด๋ค. N์ ์ต๋ 100์ด๋ค.
int find(int sub, int N, int X) {
int start = 0, end = N-1, t;
while (start <= end){
int mid = (start+end)/2;
int v = compare(mid, X);
if (v > 0) start = mid + 1; // ๊ธฐ์ค๊ฐ๋ณด๋ค ์์ผ๋ฉด start๋ฅผ ๋น๊ธฐ๊ธฐ
else if (v) end = mid - 1; // ๊ธฐ์ค๊ฐ๋ณด๋ค ํฌ๋ฉด end๋ฅผ ๋น๊ธฐ๊ธฐ
else return mid;
}
return -1;
}
์๋ฅผ ๋ค์ด, A[] = {3, 4, 7, 9, 23, 110}์ด๊ณ X = 4์ผ ๋,
start = 0, end = 5. ์ฒซ mid ๊ฐ์ 5/2 = 2.
compare(2, 4) : A[2] = 7 > 4์ด๊ณ , ๋ฆฌํด๊ฐ์ -1. end = mid - 1 = 1
start = 0, end = 1. mid ๊ฐ์ 1/2 = 0.
compare(0, 4) : A[0] = 3 < 4์ด๋ฏ๋ก, ๋ฆฌํด๊ฐ์ 1. start = mid + 1 = 1
start = 1, end = 1. mid ๊ฐ์ 2/2 = 1.
compare(1, 4) : A[1] = 4 == 4์ด๋ฏ๋ก, ๋ฆฌํด๊ฐ์ 0. ๋ฐ๋ผ์ return mid (= 1).
2. ๊ฒฝ๋น์ค
์์ง์ ์์ n์ฑ์ ์ง์ด ์๊ณ , ๊ฐ ์ง i์ ์ขํ๋ ์ ์ xi๋ก ํํํ ์ ์๋ค. ์ฌ๊ธฐ์ k๊ฐ์ ๊ฒฝ๋น์ค์ ๋์ผ๋ ค๊ณ ํ๋๋ฐ, ๊ฒฝ๋น์ค์ ์ ์ ์ขํ ์์ ๋์ ์ ์๋ค. ๊ฐ์ ์ขํ ์์ ์ง๊ณผ ๊ฒฝ๋น์ค์ด ๋์์ ์ฌ ์ ์๋ค. ๊ฒฝ๋น์ค์ ๋์ ๋ ์ค์ํ ๊ฒ์ ๊ฒฝ๋น์ค์์ ๊ฐ์ฅ ๋จผ ์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ต์ํํ๋ ๊ฒ์ด๋ค. n์ฑ์ ์ง์ k๊ฐ์ ๊ฒฝ๋น์ค์ ํจ์จ์ ์ผ๋ก ๋ฐฐ์นํ์ ๋, ๊ฒฝ๋น์ค์์ ์ง๊น์ง ๊ฐ์ฅ ๋จผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ง ๊ฐ์ n & ๊ฒฝ๋น์ค ๊ฐ์ k๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ์ง์ ์ขํ๋ฅผ ์ ๋ ฅ๋ฐ์ ํ
์ง์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒฝ๋น์ค๊น์ง์ ์ต๋ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
brute force
์ฒซ๋ฒ์งธ ์ง์์ ๋ง์ง๋ง ์ง๊น์ง์ ๊ฑฐ๋ฆฌ = M
(M,k)๊ฐ ์กฐํฉ์ ๋ชจ๋ ํด๋ณธ๋ค -> O(M^k)
์ฐฉ์์
๊ฒฝ๋น์ค์ด k๊ฐ๋ผ๋ฉด, ์ง์์ ๊ฒฝ๋น์ค๊น์ง์ ์ต๋ ๊ฑฐ๋ฆฌ๋ M/2k ๋ณด๋ค ํด ์ ์๋ค. ์ฆ, ๊ฐ์ ๊ฐ๊ฒฉ์ผ๋ก ๋๊ธฐ๋ง ํ๋ฉด ๋จ
๊ฒฝ๋น์ค์ด ํ๋ ๋ ๋์ด๋๋ฉด ์ต๋ ๊ฑฐ๋ฆฌ๋ ํ์คํ ์ค์ด๋ ๋ค.
๋ชจ๋ ์ง์์ ๊ฒฝ๋น์ค๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ d๊ฐ ๋๊ฒ ๊ฒฝ๋น์ค์ ๋์ ์ ์๋ค๋ฉด,
d+e๊ฐ ๋๊ฒ๋ ๋์ ์ ์๋ค. (e๋ ์์)
ํ์ด
์ง๋ค์ x์ขํ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค. ๋งจ ์ผ์ชฝ(์ฒ์)์ง๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฝ์ด๋๊ฐ๋ฉด์,
k๊ฐ์ ๊ฒฝ๋น์ค์ ๋์์ ๊ฐ์ฅ ๋จผ ์ง๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ d๊ฐ ๋๋์ง๋ฅผ ์ ๊ฒํ๋ค.
๋งจ ์ผ์ชฝ ์ง์ ์๊ฐํด๋ณด๋ฉด ๊ฒฝ๋น์ค์ ์ด ์ง ์ขํ์์ d๋งํผ ์ค๋ฅธ์ชฝ์ ๋จ์ด์ง ๊ณณ์ ์์ ๊ฒ์ด๋ค.
์ด ๊ฒฝ๋น์ค๋ก๋ถํฐ ๊ฑฐ๋ฆฌ๊ฐ d ์ด๋ด์ธ ์ง์ ๋ชจ๋ ์ ๊ฑฐํ ๋ค์,
๋จ์ ์ง์ ๋ํด์ ๋๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ํ์ํ ๊ฒฝ๋น์ค์ ์๊ฐ ๋์จ๋ค.
๋ง์ฝ ๊ฒฝ๋น์ค ์๊ฐ k๊ฐ ์ดํ๋ผ๋ฉด, d๊ฐ(๊ฑฐ๋ฆฌ)์ ์ค์ฌ์ ๋ต์ธ์ง ์ ๊ฒํ๋ค.
๋ง์ฝ ๊ฒฝ๋น์ค ์๊ฐ k๊ฐ ์ด๊ณผ๋ผ๋ฉด, d๊ฐ(๊ฑฐ๋ฆฌ)์ ๋๋ ค์ ๋ต์ธ์ง ์ ๊ฒํ๋ค. (์ด์งํ์)
์ด ๋ฌธ์ ๋ ๋ต์ ๊ตฌํ๊ธฐ๋ ์ด๋ ต์ง๋ง, ๋ต์ ํ๋ณด๋ฅผ ์ฃผ์์ ๋ ์ด ๋ต์ด ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง O(n)์๊ฐ์ ํ์ ๊ฐ๋ฅํ๋ค.
์ผ๋จ ๋ต์ด d๋ผ๋ฉด d ์ด์์ ๋ฌด์กฐ๊ฑด ๋ต์.
๋ฐ๋ผ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต์์ d๋ฅผ ์ฐพ์์ผ ํ๋ค.
3. Heron's method
sqrt(2)์ ๊ฐ์?
1์ ์๋. (1^2 = 1. 2๋ณด๋ค ์๋ค)
2/1 = 2๋ ์๋. (2^2 = 4. 2๋ณด๋ค ํฌ๋ค)
(1+2/1) / 2 = 3/2๋ ์๋. ํ์ง๋ง ๋ต์ ์กฐ๊ธ ๋ ๊ทผ์ ํจ
๊ทธ๋ ๋ค๋ฉด, (3/2 + 2/(3/2)) / 2 = 17/12 ๋ ๋ต์ ๋ ๊ทผ์ ํจ
x < sqrt(2) ๋ผ๋ฉด, 2/x > sqrt(2) ์ด๋ฏ๋ก
(x + 2/x) / 2๋ ๋ณด๋ค ๋ sqrt(2)์ ๊ทผ์ ํด ์๋ค.
4. ํฌ๋ฃจ์ค์ปฌ์ ๊ณต (BOJ 1396)
https://www.acmicpc.net/problem/1396
๋์ด๋ ํ๋ 1..ใ ใ
์์ ์ ๋ ฅ์ ๋ณด๋ฉด,
๊ฐ์ค๊ทธ๋ํ G=(V, E, W)๊ฐ ์ฃผ์ด์ง๊ณ , ์ฌ๊ธฐ์ Q๊ฐ์ ์ง์ (u,v)๊ฐ ์ฃผ์ด์ง๋ค.
์ด ์ง์์ ๋ํ ๋ต์ ์ ์ c์ธ๋ฐ,
์ด๋ w(e) <= c์ธ edge๋ง ์ด์ฉํ์ฌ u์ v๋ฅผ ์ด์ ์ ์๋ ์ต์๊ฐ์ด๋ค.
์ฐธ๊ณ : ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ(Kruskal Algorithm)
๊ฐ์ค์น๊ฐ ์๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ๋ฅผ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ก ๋ง๋๋ ์๊ณ ๋ฆฌ์ฆ.
(์ต์ ์ ์ฅ ํธ๋ฆฌ = ๊ฐ์ค์น๊ฐ ์ต์์ด๊ณ ์ฌ์ดํด์ด ์๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ)
์ฌ์ดํด์ด ์์ผ๋ฏ๋ก ๊ฐ์ ์ ์ = (์ ์ ์ - 1)
ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ Greedy์ ์ํ๋ฉฐ, ๋งค๋ฒ ์ํ์ด ๋์ง ์๋๋ก ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์ ์ ๋ค์ ๊ฐ์ ์ ์ ํ.
์๊ฐ๋ณต์ก๋ O(E log N)
ํ์ด 1. ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ * Q
๊ฐ ์ง์๋ง๋ค ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ฆฌ๋ฉด์, u์ v๊ฐ ์ฐ๊ฒฐ๋๋ ์๊ฐ ์ด ๋ edge์ ๊ฐ์ค์น ๊ฐ์ด ๋ต c์ด๋ค.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ O(|E| log |N|).
edge์ ๊ฐ์ค์น ์ ๋ ฌ์ O(|E| log |N|).
edge๋ฅผ ์ฝ์ผ๋ฉฐ ์ฒ๋ฆฌํ๋๋ฐ์ O(|E|)
์ง์๋ฅผ ์ด Q๋ฒ ๋๋ฆฌ๋ฏ๋ก ์ด O( Q|E| log |N| )
๋์ผํ ๊ทธ๋ํ์ ๋ํด ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ Q๋ฒ ์คํ์ํค๋ ๊ฒ ๋ณด๋ค ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์๊น?
ํ์ด 2. ์ด๋ถํ์
lo = 0, hi = ๊ฐ์ค์น ์ต๋๊ฐ, c๋ ๊ตฌ๊ฐ (lo, hi]์ ์กด์ฌ.
mid = (lo + hi) / 2.
w(e) <= mid ์ธ edge๋ง์ผ๋ก u, v๋ฅผ ์ฐ๊ฒฐํ ์ ์๋์ง?
-> ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ค์น๊ฐ ์ต๋mid์ธ edge๋ค๋ง ์ฌ์ฉํ๋ฉด ์ ์ ์๋ค.
๋ง์ฝ u์ v๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ค๋ฉด, c๋ (lo, mid] ์์ ์๋ค.
๊ทธ๋ ์ง ์๋ค๋ฉด, c๋ (mid, hi] ์์ ์๋ค.
ํ์ด2 ๊ฒํ -> ๋ ธ๋๊ฐ |V|๊ฐ์ผ ๋,
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ O(|E| log |N|).
ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ log |E| ๋ฒ ๋๋ฆฌ๋ฉด = O(|E| log |V|). ์ด ๋ edge ๊ฐ์ค์น๊ฐ ๋ณํ์ง ์์ผ๋ฏ๋ก ์ฌ์ ๋ ฌํ ํ์ X.
์ง์๊ฐ Q๊ฐ์ด๋ฏ๋ก ์ด O( Q|E| log |N| ).
์ด๋ผ ๋๊ฐ์์?
์ด์งํ์ ๋ณด์
Q๊ฐ์ ์ง์๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌํ์ง ๋ง๊ณ , ์ง์์ ๊ฐ์ ๋จ๊ณ๋ฅผ ๋์์ ์งํํ๋ฉด?
์๋ฅผ ๋ค์ด Q = 4์ผ ๋,
์ฒ์์๋ Q1~Q4๊น์ง ๋ชจ๋ lo, hi๊ฐ ๊ฐ๋ค. mid๋ ๊ฐ๊ณ ,
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ํ ๋ฒ ๋๋ ค์ ๊ฐ์ค์น๊ฐ mid์ธ ์์ง๊น์ง ์ฝ์ผ๋ฉด ์ข ๋ฃ. (1๋ฒ์ผ๋ก 4๊ฐ์ ์ง์ ์ฒ๋ฆฌ)
๋๋ฒ์งธ์๋ Q1,Q2๋ ๋ต์ด mid๋ณด๋ค ์ปค์ผํ๊ณ , Q3,Q4๋ ๋ต์ด mid๋ณด๋ค ์์์ผํ๋ค๊ณ ํ์.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ฒ ๋ ๋๋ฆฌ๋๋ฐ
์ด ๋ ์ฝ๊ณ ์๋ ์์ง์ ๊ฐ์ค์น๊ฐ (lo+mid)/2์ธ ์์ , (mid+hi)/2์ธ ์์ ์์ ๊ฐ๊ฐ Q1, Q2 ๊ทธ๋ฆฌ๊ณ Q3,Q4๋ฅผ ๊ฒํ .
์ธ๋ฒ์งธ์์๋ mid๊ฐ์ด ๊ฐ์ ์ง์๋ผ๋ฆฌ ๋ชจ์ ๋ค,
ํ๋ฒ์ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก mid ๊ฐ์ ์ฒ๋ฆฌ.
์๊ฐ๋ณต์ก๋
์ด๋ถ ํ์์ ๋ชจ๋ log |E| ๋ฒ ์งํํ๋๊ฑด ๋ง์ฐฌ๊ฐ์ง์ด์ง๋ง,
๋งค ๋จ๊ณ๋ง๋ค ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ 1๋ฒ๋ง ์งํํ๋ฉฐ,
ํ๋ฒ ์ํํ๋ฉด์ ์ง์์ ์ค๊ฐ๊ฐ์ ์ง๋๊ฐ ๋ ๋ง๋ค ๋ฒ์๋ฅผ ๊ฐฑ์ ํ๊ธฐ ๋๋ฌธ์
ํฌ๋ฃจ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ ์ด ์ํ์๊ฐ์ O( Q+|E| ). = ์์ง๋ฅผ ๋ค ์ฝ๊ณ Q๊ฐ์ ์ง์ ๋ฒ์ ์ ๋ฐ์ดํธ
์ ์ฒด ์๊ฐ๋ณต์ก๋๋ O( (Q+|E|) log |E| ).
5. ๋ฏผํ์ด์ ๊ฒ์ ํํฐ (BOJ 16976)
https://www.acmicpc.net/problem/16976
ํ๋ 2..
N๊ฐ์ ๋ ธ๋๊ฐ ์ฃผ์ด์ง๊ณ ๊ฐ ๋ ธ๋์๋ 1~M๊น์ง์ ์๊ฐ ์ฐ์ฌ์๋ค.
1๋ฒ๋ถํฐ Q๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง ์์ง๋ค์ด ์ฃผ์ด์ง๋ค.
๋ ธ๋์ ์ฐ์ธ ์ซ์ ๊ฐ๊ฐ๋ง๋ค 1๋ฒ ์์ง๋ถํฐ i๋ฒ ์์ง๊น์ง๋ฅผ ์ด์ฉํด์ ๊ฐ์ ์ซ์์ธ ๋ ธ๋๋ค์ ๋ชจ๋ ์ฐ๊ฒฐํ ์ ์๋
์ต์์ i ๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ .
ํ์ด : ์ด์งํ์
์ i๊ฐ ์ฐ์ธ ๋ ธ๋๊ฐ A,B,C๋ผ๊ณ ํ๋ฉด
์ด ์ง๋ฌธ์ A,B,C๊ฐ ๋ชจ๋ ์ฐ๊ฒฐ๋๋ ์ต์ด์ ์์ ์ ๋ฌป๋ ๊ฒ์ด๋ค.
๋ ธ๋ A์ ๋ ธ๋ B๊ฐ ์ฐ๊ฒฐ๋์ด์๊ณ , A์ C๊ฐ ์ฐ๊ฒฐ๋์ด์๋ค๋ฉด, B์ C๋ ์ฐ๊ฒฐ๋์ด์๋ ์ํ์ด๋ค.
๋ฐ๋ผ์ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊พผ๋ค.
1๋ฒ๋ถํฐ mid๋ฒ๊น์ง์ ์์ง๋ก A์ B๋ฅผ ์ฐ๊ฒฐํ ์ ์๋๊ฐ?
1๋ฒ๋ถํฐ mid๋ฒ๊น์ง์ ์์ง๋ก A์ C๋ฅผ ์ฐ๊ฒฐํ ์ ์๋๊ฐ?
i๊ฐ ๊ฐ์ ๋ ธ๋์ ๋ํด ์ง๋ฌธ์ ์ด๋ ๊ฒ ํ ๋ค, ์ง์์ ๋ต ์ค ์ต๋๊ฐ์ด A,B,C ๋ชจ๋๊ฐ ์ฐ๊ฒฐ๋๋ ์์ ์ด ๋๋ค.
๋ชจ๋ ์ง๋ฌธ์ ๊ฐ์๋ ๋ ธ๋์ ๊ฐ์๋ณด๋ค ๋ง์ง ์๋ค.
'๐ ์ ๊ณต ๊ณต๋ถ > ๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 9. Flow Networks (0) | 2023.06.16 |
---|---|
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 8. ์๋ก์์ธ ์งํฉ์ ํํ (Disjoint Sets) (0) | 2023.06.16 |
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 6. ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ (0) | 2023.04.18 |
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 5. ์์ฌ์์ด ๊ธฐ๋ฒ (0) | 2023.04.17 |
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 4. ์๋ฃ๊ตฌ์กฐ2 (0) | 2023.04.16 |