- Today
- Total
- PS
- ๋ฌธ๋ฒ
- spring
- MST
- ๊ตฌํ
- java
- Graph
- tree
- ๋ฐฑ์ค
- ์กธ์ ์ํ
- database
- BFS
- ์๋ฐ์์ ์
- ํ๋ก๊ทธ๋๋จธ์ค
- array
- pytorch
- Algorithm
- ์๋ฐ
- ๋ค์ต์คํธ๋ผ
- OOP
- CS
- ์๋ฃ๊ตฌ์กฐ
- ์ธํด
- ๋ฒจ๋งํฌ๋
- leetcode
- dp
- ์์์ ๋ ฌ
- ๊ทธ๋ฆฌ๋
- ๋ฐฑ์๋
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
Partially Committed
[Meet in the middle] ๋ฐฑ์ค 1450 ๋ ์ ๋ฌธ์ ๋ณธ๋ฌธ
[Meet in the middle] ๋ฐฑ์ค 1450 ๋ ์ ๋ฌธ์
WonderJay 2023. 3. 6. 13:31https://www.acmicpc.net/problem/1450
๋ธ๋ฃจํธํฌ์ค๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์๋ N ์ด ๋๋ฌด ํฐ ๊ฒฝ์ฐ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ต์ ํ๋ฅผ ์๋ํ ์ ์๊ฒ ์ง๋ง,
๋ถํ ์ ๋ณต์ฒ๋ผ N ์ ์ ๋ฐ์ฉ ๋๋ ์ ์ฐ์ฐํ ๋ค์์ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ์ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์
meet in the middle ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋ค.
๋ค๋ง, ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํด์ N/2, N/4 ... 1 ์ฒ๋ผ ๊ณ์ ์ชผ๊ฐ๋ ๊ฒ ์๋๊ณ
๋งจ ์ฒ์์ 1ํ๋ง ๋ฐ์ผ๋ก ์ชผ๊ฐ๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด ๊ธธ์ด๊ฐ 40 ์ธ ์์ด์ด ์ฃผ์ด์ก์ ๋, ์ด ์์ด๋ค์ ์ด๋ฃจ๋ ์์๋ค ์ค ๋ช ๊ฐ๋ฅผ
์ค๋ณตํด์ ๋ํ ๊ฐ์ด ํน์ ๊ฐ์ด ๋๋๋ก ํ๋ ์กฐํฉ์ด ์ผ๋ง๋ ์กด์ฌํ๋ ์ง ์์๋ด์ผ ํ๋ค๊ณ ์๊ฐํด๋ณด์.
๊ทธ๋ฌ๋ฉด, ๋ชจ๋ ์์๋ฅผ ์ํํ๋ฉด์ i ๋ฒ์งธ ์์๋ฅผ ํฌํจํ ์ง ๋ง ์ง๋ฅผ ๊ฒฐ์ ํด์ฃผ๋ฉด ๋์ง๋ง
ํด๋น ๋ฐฉ๋ฒ์ 2^40 ๋ฒ์ ์ฐ์ฐ์ด ํ์ํ๊ณ ์ด๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ฅผ ์ต์ ํํ๊ธฐ ์ํด์ ๊ธธ์ด๊ฐ 40 ์ธ ์์ด์ ์ ๋ฐ์ผ๋ก ๋๋์ด๋ณด์.
๊ฐ๊ฐ์ ์์ด์ ํ์ํ๋ ๊ฒฝ์ฐ์ ์๋ 2^20 ์ด๋ฏ๋ก 2^20*2 ~= 2^21 ๋งํผ์ ์ฐ์ฐ์ด ํ์ํ ๊ฒ์ด๋ค.
๊ทผ๋ฐ ๋๋์ด์ ์ด๋ป๊ฒ ํ๋ ค๋ ๊ฑธ๊น?
๋ฐ์์ ๊ฐ๋จํ๋ค.
0~n/2 ๊น์ง์ ๋ฐฐ์ด์ lv, n/2~n ๊น์ง์ ๋ฐฐ์ด์ rv ๋ผ๊ณ ํ์.
๊ทธ๋ฌ๋ฉด lv ์ ์์๋ฅผ ์ํํ๋ฉด์ target - lv[i] ๊ฐ rv ์ ๋ช ๊ฐ ์กด์ฌํ๋ ์ง ๊ตฌํด์ฃผ๋ฉด ๋๋ค.
์ด๋ฅผ ์ํด์๋ ์ด๋ถ ํ์์ ์ด์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
์ ๋ฆฌํ๋ฉด meet in the middle ์๊ณ ๋ฆฌ์ฆ์ n^m ์ ์ฐ์ฐ์ 2*n^(m-1) ์ ์ฐ์ฐ์ผ๋ก ์ค์ผ ์ ์๋ค.
๋ฌธ์ ์ ์ ์ฉํด๋ณด์.
๋ ์ ๋ฌธ์ (๋ฐฑ์ค 1450)๋ ์ ํ์ ์ธ meet in the middle ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ ๋ฌธ์ ์ด๋ค.
N ๊ฐ์ ๋ฌผ๊ฑด์ ๊ฐ์ง๊ณ ์๊ณ , ์ต๋ C ๋งํผ์ ๋ฌด๊ฒ๋ฅผ ๋ฃ์ ์ ์์ ๋
N ๊ฐ์ ๋ฌผ๊ฑด์ ๊ฐ๋ฐฉ์ ๋ฃ์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ์๋ด์ผ ํ๋ค.
์ด๋ป๊ฒ ํ ๊น?
N <= 30 ์ด๋ฏ๋ก ์์ ํ์ํ๋ ๊ฒฝ์ฐ์๋ ์ต๋ 2^30 ~= 1073741824 ๋ฒ์ ์ฐ์ฐ์ด ํ์ํ ๊ฒ์ด๋ค.
๋์ถฉ 10 ์ด ์ ๋๊ฐ ๊ฑธ๋ฆด ๊ฒ ๊ฐ์๋ฐ, ์ ๋ฌธ์ ์ ์๊ฐ ์ ํ์ 1์ด์ด๋ฏ๋ก ์ต์ ํ๊ฐ ํ์ํ๋ค.
๋ง์ฝ์ meet in the middle ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋จ๊น?
2^15*2 ~= 65536 ๋ฒ์ ์ฐ์ฐ๊ณผ ์ด๋ถํ์(nlogn)์ ์ํด
์ด 65536 + 65536 * long(65536) ~= 65536 + 5 * 65536 ~= 393216 ๋ฒ์ ์ฐ์ฐ์ด ํ์ํ ๊ฒ์ด๋ผ๊ณ ์ถ์ธกํ ์ ์๋ค.
์ฆ, meet in the middle ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ ๋ฌธ์ ๋ฅผ ์๊ฐ์ ํ 1์ด ์์ ๋๋ํ๊ฒ ํด๊ฒฐ์ด ๊ฐ๋ฅํจ์ ๊ฒ์ฆํ ์ ์์๋ค.
๊ตฌํํ๊ธฐ ์ ์ ์ด๋ป๊ฒ ํ์ด์ผ ํ ์ง ์ค๊ณ๋ฅผ ํด๋ณด์.
n ๊ฐ์ ๋ฐฐ์ด ์ค์์ i ๊ฐ๋ฅผ ์ ํํ์ฌ ๋ํ ๊ฒ์ด c ์ดํ์ธ ์กฐํฉ์ ์๋ฅผ ๊ตฌํ๋ฉด ๋๊ณ
์ด๋ฅผ ์ํด์ ์ฐ๋ฆฌ๋ meet in the middle ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
๊ธธ์ด๊ฐ n ์ธ arr ๋ฐฐ์ด์ 0~n/2 ๊น์ง์ ์์๋ค๋ก ๋ง๋ค์ด ๋ผ ์ ์๋ ๋ถ๋ถ ํฉ์ ๋ฐฐ์ด์ lv
๊ธธ์ด๊ฐ n ์ธ arr ๋ฐฐ์ด์ n/2~n ๊น์ง์ ์์๋ค๋ก ๋ง๋ค์ด ๋ผ ์ ์๋ ๋ถ๋ถ ํฉ์ ๋ฐฐ์ด์ rv ๋ผ๊ณ ํ์.
๋ถ๋ถํฉ์ ๊ตฌํ๋ ค๋ฉด dfs ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
private static void dfs(int s, int e, long sum, ArrayList<Long> v) {
if (s >= e) {
v.add(sum);
return;
}
dfs(s + 1, e, sum, v);
dfs(s + 1, e, sum + arr[s], v);
}
์ ์ฝ๋์ ๊ฐ์ด ์์์ ๊ณผ ๋ ์ ๊ทธ๋ฆฌ๊ณ ๋ถ๋ถํฉ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ํจ์๋ฅผ ๊ตฌํํ์๋ค.
s>=e ์ธ ๊ฒฝ์ฐ (์ ํจํ ๊ฒฝ์ฐ) ์๋ ๋ฐฐ์ด์ ๋ถ๋ถํฉ์ add ํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ s ๋ฒ์งธ ์์๋ฅผ ํฌํจํ์ง ์๋ ๊ฒฝ์ฐ dfs(s+1, e, sum, v)
s ๋ฒ์งธ ์์๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ dfs(s+1, e, sum+arr[s], v) ๋ฅผ ํ์ํด์ค์ ๋ถ๋ถํฉ์ ๋ชจ๋ ๊ตฌํด๋ผ ์ ์๋ค.
๋ฉ์ธ ํจ์์์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ์ฌ lv, rv ๋ฅผ update ํ ์ ์๋ค.
dfs(0, n / 2, 0, lv);
dfs(n / 2, n, 0, rv);
lv ์ rv ๋ ๊ฐ๊ฐ 0~n/2 , n/2~n ๊น์ง์ ์์๋ค๋ก ๋ง๋ค์ด ๋ผ ์ ์๋ ๋ถ๋ถํฉ์ด ์์๋ก ๋ด๊ฒจ์๋ค.
์ด์ ์ด๋ป๊ฒ ํ ๊น?
์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ๊ฒ์ n ๊ฐ์ ์์ ์ค์์ i ๊ฐ๋ฅผ ์ ํํด์ ๋ํ ๊ฒ์ด c ์ดํ๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ์์ ์ด๋ค.
rv ์ ์์๋ฅผ ์์ฐจ ํ์ํ๋ค. ์ด๋ ์์๋ฅผ ele ๋ผ๊ณ ํ์.
ele + lv[i] ๊ฐ c ์ดํ๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ์กฐ๋ฆฌ ๋ํด์ฃผ๋ฉด ๋์ง ์์๊น?
์ด๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํ๊ธฐ ์ํด์ ์ด๋ถํ์์ ๊ตฌํํ์.
๋จผ์ lv ๋ฅผ ์ ๋ ฌํ๋ค. (์ด๋ถ ํ์์ ๋ฐฐ์ด์ด ์ ๋ ฌ๋์ด ์๋ ์ํฉ์์ ์ ์ฉ๊ฐ๋ฅํ๋ค.)
๊ทธ๋ฆฌ๊ณ rv ์ ๊ฐ๊ฐ์ ์์ ele ์ ๋ํ์ฌ ele + lv[mid] ๊ฐ c ์ดํ์ธ ๊ฒฝ์ฐ๋ฅผ answer ๋ณ์์ ๋์ ์์ผ์ฃผ๋ฉด ๋๋ค.
Collections.sort(lv);
long ans = 0;
for (long ele : rv) {
if (ele > c)
continue;
int left = 0;
int right = lv.size();
int mid = 0;
while (left < right) {
mid = (left + right) / 2;
if(ele + lv.get(mid) > c)
right = mid;
else
left = mid+1;
}
ans += right;
}
์ด๋ถ ํ์์ ํญ์ ํท๊ฐ๋ฆฐ๋ค..
์ด๋ถ ํ์์ ์กฐ๋ง๊ฐ ํ๋ฒ ๊ฒ์๋ฌผ๋ก ์ ๋ฆฌํด์ผ๊ฒ ๋ค.
์ ์ฒด ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int c;
static int[] arr;
static ArrayList<Long> lv = new ArrayList<>();
static ArrayList<Long> rv = new ArrayList<>();
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk;
stk = new StringTokenizer(br.readLine());
n = Integer.parseInt(stk.nextToken());
c = Integer.parseInt(stk.nextToken());
arr = new int[n];
stk = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(stk.nextToken());
}
dfs(0, n / 2, 0, lv);
dfs(n / 2, n, 0, rv);
Collections.sort(lv);
long ans = 0;
for (long ele : rv) {
if (ele > c)
continue;
int left = 0;
int right = lv.size();
int mid = 0;
while (left < right) {
mid = (left + right) / 2;
if(ele + lv.get(mid) > c)
right = mid;
else
left = mid+1;
}
ans += right;
}
bw.write(ans+"\n");
bw.flush();
bw.close();
}
private static void dfs(int s, int e, long sum, ArrayList<Long> v) {
if (s >= e) {
v.add(sum);
return;
}
dfs(s + 1, e, sum, v);
dfs(s + 1, e, sum + arr[s], v);
}
}
์ฐธ๊ณ
https://killerwhale0917.tistory.com/5
'๐ฅ Algorithm || ๋ฌธ์ ํ์ด > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํธ๋ฆฌ์ ์ง๋ฆ ๊ตฌํ๊ธฐ] ๋ฐฑ์ค 1167 (JAVA) - dfs / ๋ค์ต์คํธ๋ผ (0) | 2023.03.20 |
---|---|
[Union and Find] ๋ฐฑ์ค 20040 ์ฌ์ดํด ๊ฒ์ (0) | 2023.03.07 |
[๋ฐฑ์ค 13549/1956/1620/2629] ์๋ฐ (0) | 2023.02.22 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์นด๋๋ญ์น (JAVA) (1) | 2023.02.20 |
[๋ฐฑ์ค 9251/1520/9370] ์๋ฐ (0) | 2023.02.20 |