๐ 1. ๋ฌธ์ ์๊ฐ
2143๋ฒ: ๋ ๋ฐฐ์ด์ ํฉ
์ฒซ์งธ ์ค์ T(-1,000,000,000 ≤ T ≤ 1,000,000,000)๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ n(1 ≤ n ≤ 1,000)์ด ์ฃผ์ด์ง๊ณ , ๊ทธ ๋ค์ ์ค์ n๊ฐ์ ์ ์๋ก A[1], …, A[n]์ด ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ m(1 ≤ m ≤ 1,000)์ด ์ฃผ์ด์ง๊ณ , ๊ทธ
www.acmicpc.net
ํด๋น ๋ฌธ์ ๋ ์ด๋ถ ํ์๊ณผ ํฌ ํฌ์ธํฐ๋ก ํ ์ ์๋ค.
๐ 2. ์ด๋ถ ํ์์ ์ด์ฉํ ํ์ด
๐งต 1. ํ์ด
๊ฐ๋จํ๊ฒ ์๊ฐํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ฆด ์ ์๋ค.
- A์ B์ ๋ถ ๋ฐฐ์ด์ ํฉ์ ๊ตฌํ๋ค.
- A์ ๋ถ ๋ฐฐ์ด์ ํฉ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋๋ฉด์, B์ ๋ถ ๋ฐฐ์ด์ ํฉ์์ ์ด๋ถ ํ์์ ์ด์ฉํ์ฌ T๋ฅผ ๋ง๋ค ์ ์๋ ๊ฐ์ ์ฐพ๋๋ค. (๋ฌผ๋ก B์ ๋ถ ๋ฐฐ์ด์ ํฉ์ ๊ธฐ์ค์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ๋์๋ ๋๋ค.)
ํ์ง๋ง, ์ด๋ ๊ฒ ํ๋ฉด ์ ๋๋ค. ๋ฐฐ์ด์ ์ค๋ณต๋๋ ๊ฐ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋จ์ํ ์ด๋ถํ์์ผ๋ก ๊ฐ์ด ์๋์ง ์๋์ง๋ง ์ฐพ์ ๊ฒ์ด ์๋ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๊ฐ์ด ๋ช ๊ฐ๊ฐ ์๋์ง๋ฅผ ์ฐพ์์ผ ํ๋ค.
์ด๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด Lower Bound์ Upper Bound๋ค.
- Lower Bound
์ฐพ๊ณ ์ ํ๋ ๊ฐ ์ด์์ด ์ฒ์์ผ๋ก ๋ํ๋๋ ์์น
์ฆ, ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๊ทธ ์ด์์ ๊ฐ์ด ์ฒ์์ผ๋ก ๋ํ๋๋ ์์น๋ฅผ ์๋ ค์ค๋ค. - Upper Bound
์ฐพ๊ณ ์ ํ๋ ๊ฐ๋ณด๋ค ํฐ ๊ฐ์ด ์ฒ์์ผ๋ก ๋ํ๋๋ ์์น
Lower Bound์ Upper Bound๋ฅผ ์ด์ฉํ์ฌ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๊ฐ์ ๊ฐ์๋ฅผ ์ฐพ์ ์ ์๋ค.
๐งต 2. ์ฝ๋
public class Main {
static int T, N, M;
static long ansCnt;
static int[] numsA, numsB, sumA, sumB, partA, partB;
static String[] ss;
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(in.readLine());
N = Integer.parseInt(in.readLine());
numsA = new int[N];
sumA = new int[N + 1];
ss = in.readLine().split(" ");
for(int i = 0; i < N; i++) {
numsA[i] = Integer.parseInt(ss[i]);
// ๋์ ํฉ
sumA[i + 1] = sumA[i] + numsA[i];
}
// ๋ถ ๋ฐฐ์ด์ ํฉ
int temp = 0;
partA = new int[((N + 1) * (N)) / 2];
for(int cnt = 1; cnt <= N; cnt++) {
for(int st = 0; st + cnt <= N; st++) {
partA[temp++] = sumA[st + cnt] - sumA[st];
}
}
M = Integer.parseInt(in.readLine());
numsB = new int[M];
sumB = new int[M + 1];
ss = in.readLine().split(" ");
for(int i = 0; i < M; i++) {
numsB[i] = Integer.parseInt(ss[i]);
// ๋์ ํฉ
sumB[i + 1] = sumB[i] + numsB[i];
}
// ๋ถ ๋ฐฐ์ด์ ํฉ
temp = 0;
partB = new int[((M + 1) * (M)) / 2];
for(int cnt = 1; cnt <= M; cnt++) {
for(int st = 0; st + cnt <= M; st++) {
partB[temp++] = sumB[st + cnt] - sumB[st];
}
}
Arrays.sort(partA);
Arrays.sort(partB);
// 1. ์ด๋ถ ํ์์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
for(int i = 0; i < partA.length; i++) {
int aValue = partA[i];
int bValue = T - aValue;
// bValue์ ํด๋นํ๋ ๊ฐ์ ๊ฐ์๋ฅผ ๊ตฌํ๊ธฐ
int bValueCnt = upperBound(partB, bValue) - lowerBound(partB, bValue);
ansCnt += bValueCnt;
}
System.out.println(ansCnt);
}
private static int lowerBound(int[] arr, int key) {
int l = 0;
int r = arr.length;
while(l < r) {
int mid = (l + r) / 2;
if(arr[mid] < key)
l = mid + 1;
else
r = mid;
}
return r;
}
private static int upperBound(int[] arr, int key) {
int l = 0;
int r = arr.length;
while(l < r) {
int mid = (l + r) / 2;
if(arr[mid] <= key)
l = mid + 1;
else
r = mid;
}
return r;
}
}
๐ 3. ํฌ ํฌ์ธํฐ๋ฅผ ์ด์ฉํ ํ์ด
๐งต 1. ํ์ด
๊ฒฐ๊ตญ A์ ๋ถ ๋ฐฐ์ด์ ๊ฐ๊ณผ B์ ๋ถ ๋ฐฐ์ด์ ๊ฐ์ ๋ํ๋ ๊ฒ์ด๋ฏ๋ก ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํ ์ ์๋ค. ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ ํ, A๋ ์ ์ผ ์ผ์ชฝ์์ ์์ํ๊ณ B๋ ์ ์ผ ์ค๋ฅธ์ชฝ์์ ์์ํ๋ฉด ๋๋ค. (๋ฐ๋ ๋ฐฉํฅ๋ ๊ฐ๋ฅํ๋ค.)
๊ทธ๋ฆฌ๊ณ ๊ฐ ํฌ์ธํฐ์ ํฉ์ด T๋ณด๋ค ์์ ๊ฒฝ์ฐ A๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก, T๋ณด๋ค ํฐ ๊ฒฝ์ฐ B๋ฅผ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ฉด ๋๋ค. ํฉ์ด T์ธ ๊ฒฝ์ฐ์๋ ๋จ์ํ ์นด์ดํธ๋ฅผ +1๋ง ํด์ฃผ๋ ๊ฒ์ด ์๋๋ผ, ์ค๋ณต๋ ๊ฐ์ด ๋ช ๊ฐ ์๋์ง ํ์ธํ์ฌ ๊ทธ์ ํด๋นํ๋ ๊ฐ์ cnt์ ๋ํด์ค์ผ ํ๋ค.
๐งต 2. ์ฝ๋
public class Main {
static int T, N, M;
static long ansCnt;
static int[] numsA, numsB, sumA, sumB, partA, partB;
static String[] ss;
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(in.readLine());
N = Integer.parseInt(in.readLine());
numsA = new int[N];
sumA = new int[N + 1];
ss = in.readLine().split(" ");
for(int i = 0; i < N; i++) {
numsA[i] = Integer.parseInt(ss[i]);
// ๋์ ํฉ
sumA[i + 1] = sumA[i] + numsA[i];
}
// ๋ถ ๋ฐฐ์ด์ ํฉ
int temp = 0;
partA = new int[((N + 1) * (N)) / 2];
for(int cnt = 1; cnt <= N; cnt++) {
for(int st = 0; st + cnt <= N; st++) {
partA[temp++] = sumA[st + cnt] - sumA[st];
}
}
M = Integer.parseInt(in.readLine());
numsB = new int[M];
sumB = new int[M + 1];
ss = in.readLine().split(" ");
for(int i = 0; i < M; i++) {
numsB[i] = Integer.parseInt(ss[i]);
// ๋์ ํฉ
sumB[i + 1] = sumB[i] + numsB[i];
}
// ๋ถ ๋ฐฐ์ด์ ํฉ
temp = 0;
partB = new int[((M + 1) * (M)) / 2];
for(int cnt = 1; cnt <= M; cnt++) {
for(int st = 0; st + cnt <= M; st++) {
partB[temp++] = sumB[st + cnt] - sumB[st];
}
}
Arrays.sort(partA);
Arrays.sort(partB);
// 2. ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ
int aLeft = 0;
int bRight = partB.length - 1;
while(aLeft < partA.length && 0 <= bRight) {
int aValue = partA[aLeft];
int bValue = partB[bRight];
if(aValue + bValue == T) {
// ์ค๋ณต๋ ๊ฐ๋ค์ ์นด์ดํธ
long aCnt = 0L;
long bCnt = 0L;
while(aLeft < partA.length && aValue == partA[aLeft]) {
aLeft++;
aCnt++;
}
while(0 <= bRight && bValue == partB[bRight]) {
bRight--;
bCnt++;
}
ansCnt += aCnt * bCnt;
}
else if(aValue + bValue < T) {
aLeft++;
}
else {
bRight--;
}
}
System.out.println(ansCnt);
}
}
'๐ ์๊ณ ๋ฆฌ์ฆ_๋ฌธ์ ํ์ด > BOJ_๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค BOJ / JAVA] ๋ฉํฐ๋ฒ์ค โ ก (18869๋ฒ) (1) | 2023.12.27 |
---|---|
[๋ฐฑ์ค BOJ / JAVA] ๊ดํธ์ ๊ฐ (2504๋ฒ) (1) | 2023.12.26 |
BOJ 14865 - ๊ณก์ ์๋ฅด๊ธฐ [JAVA] (0) | 2023.02.28 |