1. ๋ฌธ์ ์ค๋ช ๐
๋ ๋ฐฐ์ด์ ๊ตฌ๊ฐํฉ๋ผ๋ฆฌ ๋ํด์ ๋ชฉํ๊ฐ์ธ T๊ฐ ๋์ค๋ ํ์๋ฅผ ์ธ๋ ๋ฌธ์
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: Two Pointer
, Range sum
์ด๋ฒ ๋ฌธ์ ๋ ๊ฐ ๋ฐฐ์ด์์ ๋์ฌ ์ ์๋ ๊ตฌ๊ฐํฉ์ ๋ชจ๋ ๊ตฌํด์ List ํ ์ํจ ๋ค์, ์ด ๋ List์์ ๊ฐ์ ๊ฐ๊ฐ ๊บผ๋ด์ด ๋ณด๋ฉฐ, T๊ฐ ๋ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ธ์ผํ๋ค. ํ๋ง๋๋ก ์์ฝํ๋ฉด ๊ตฌ๊ฐํฉ ํ๋ณด๊ตฐ๋ค ์ฌ์ด์์ Two Pointer๋ก ์์ฝํ ์ ์๋ค.
(1) ์ ๊ทธ๋ ๊ฒ ํ์ด์ผ ํ๋์?
๋ต: ๋ฐฐ์ด์ ์์๋ก ์์๊ฐ ์กด์ฌ
์ด ๋ฌธ์ ์ ๊น๋ค๋ก์ด ์ ์ ๋ฐฐ์ด์ ์์๋ก ์์
๊ฐ ์กด์ฌํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋์ ํฉ์ ํ์ฉํ ๊ตฌ๊ฐํฉ์ ๊ตฌํ๋๋ฐ ๊ธฐ๋ณธ์ด ๋๋ ์ ์ ์กฐ๊ฑด์ "right ํฌ์ธํฐ๋ฅผ ๋๋ฆฌ๋ฉด ๊ตฌ๊ฐํฉ์ด ์ปค์ง๋ค. left ํฌ์ธํฐ๋ฅผ ๋๋ฆฌ๋ฉด ๊ตฌ๊ฐํฉ์ด ์ค์ด๋ ๋ค. " ์ธ๋ฐ,์ด๋ฒ ๋ฌธ์ ์์๋ ์์๊ฐ ๋์ ๋ ๊ฒฝ์ฐ, ์ด๊ฒ์ด ์ ์ ๋์ง ์๊ธฐ ๋๋ฌธ์, ๊ฐ์ ์์ธกํ ์ ์์ด ์ ์์กฐ์ฌ๊ฐ ํ์ํด์ง๋ค.
์์๋ฅผ ๋ค์ด๋ณด์. ์์ ๊ทธ๋ฆผ์ ์์๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด๊ณผ ๊ทธ ๋์ ํฉ์ด๋ค. value[B] - value[A] ๊ตฌ๊ฐ์ ํฉ์ 3์ด๋ค. ๊ตฌ๊ฐํฉ์ด 2์ธ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๋๋ค๊ณ ์ณค์ ๋, ์ฐ๋ฆฌ๋ A๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์์ผ์ ๊ตฌ๊ฐ ํฉ์ ์ค์ด๋ ค ๋ ธ๋ ฅํ์ ๊ฒ์ด๋ค. ์์๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๊ตฌ๊ฐํฉ์ ๊ฒฝ์ฐ ์ด์ ๊ฐ์ด ํ๋์ ๊ธฐ์ค์ ์ธ์ธ ์ ์๋ค.
๋ฐ๋ฉด, ์ด๋ฒ ๊ทธ๋ฆผ์ ๊ฒฝ์ฐ, ์์๊ฐ ์์ฌ ์๊ธฐ ๋๋ฌธ์ B๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ ์ํจ๋ค๊ณ ํด์, ๊ตฌ๊ฐํฉ์ด ์ฆ๊ฐํจ์ ์์ธก
ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ ์์กฐ์ฌ๊ฐ ํ์ํ๊ฒ ๋๋ค.
' ์ด๋ฒ ๋ฌธ์ ์์ ์ ์์กฐ์ฌ ํ๋ฉด ๋์ง ์๋?'๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง, ์๊ฐ ๋ณต์ก๋๋ฅผ ์์ธกํด๋ณด๋ฉด, ์์ ํ์์ผ๋ก ์ ๋ ํ ์ ์๋ค. ๋จผ์ ๋ฐฐ์ด์ ์์ ์ ์ต๋๊ฐ์ด 1000์ด๊ณ ๋์ ํฉ ๋ฐฐ์ด๋ ๊ฐ์ ์๋ฅผ ๊ฐ์ง ๊ฒ์ด๋ค. A๋ฐฐ์ด์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๊ฐํฉ์ ๊ตฌํ ๊ฒฝ์ฐ, ์์ ํ์์ ํด์ผํ๋ฏ๋ก ์ด์ค ๋ฐ๋ณต๋ฌธ์ด ํ์ํ๋ค. A์์ ๊ตฌํ ๊ตฌ๊ฐํฉ์ผ๋ก T๊ฐ ๊ฐ๋ฅํ B ๊ตฌ๊ฐํฉ์ ์ํด์ ๋ ์ด์ค ๋ฐ๋ณต๋ฌธ์ด ํ์ํ๋ค. ๋์ ์ฐ์๋๋ฏ๋ก, ์ต์ข
์ ์ผ๋ก 4์ค ๋ฐ๋ณต๋ฌธ
์ด ํ์ํ๊ฒ ๋๋ค. ์ด๊ฑด (10^3)^4 = O(10^12)์ด๋ฏ๋ก, 1์ต ๋ฒ์ ์ฐ์ฐ์ ํจ์ฌ ๋ฐ์ด๋๋๋ค.
(2) ํธ๋ ๋ฒ ์์ธํ ์ค๋ช
- A ๋ฐฐ์ด๊ณผ B ๋ฐฐ์ด ๋ชจ๋ ๋์ฌ ์ ์๋ ๊ตฌ๊ฐํฉ์ ๋ชจ๋ ๊ตฌํด์ LIST์ ์ ์ฅ
- LIST๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ (โ ํฌ ํฌ์ธํฐ ์งํ ์ ๊ฐ๋ค์ ์์ธกํ ์ ์๊ธฐ ์ํจ)
๋ง์ฃผ ๋ณด๋ ํฌ ํฌ์ธํฐ ์งํ
ํ์ฌ T๊ฐ ๋ ์ ์๋ ๊ฐ๋ค์ ์ฒดํฌ
(A ๊ตฌ๊ฐํฉ List์์๋ ์ผ์ชฝ(์ค๋ฆ์ฐจ์) ์ถ๋ฐ, B ๊ตฌ๊ฐํฉ List์์๋ ์ค๋ฅธ์ชฝ (๋ด๋ฆผ์ฐจ์) ์ถ๋ฐ)- ์ค๋ณต๋๋ A,B ๊ฐ๋ค๋ก T๊ฐ ์์ฑ๋ ์ ์์. โ ๋ด๋ถ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ
์ ๊น!โ๋ง์ฃผ๋ณด๋ ํฌํฌ์ธํฐ๋ฅผ ์งํํ๋ ์ด์ ?
๋ต: ์ค๋ณต๋ ๋ฐ๋ณต๋ฌธ์ ํผํ ์ ์๋ค.
๋ชฉํ ๊ฐ(T)๋ฅผ 8์ด๋ผ๊ณ ํ ๋, B๊ฐ 10์ ๊ฐ๋ฅดํค๋ ๊ฒฝ์ฐ, A = -2 ์ด์ธ์ ํด๋น ๊ฐ์ ์์ฑ ์ํฌ ์ ์๋๊ฐ? ์๋ค. ์๋ํ๋ฉด A๋ ์์ผ๋ก ๊ณ์ ์ปค์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋๋ B๋ฅผ ์์ง์ฌ ๊ฐ์ ์ค์ฌ์ผ ํ๋ค. ๋ฐ๋๋ก A๊ฐ -2์ผ๋๋ B = 10 ์ด์ธ์ ๋ค๋ฅธ ์ด๋ค ๊ฐ๋ T=8์ ๋ง์กฑ์ํฌ ์ ์๋ค. ์๋ํ๋ฉด ์์ผ๋ก ๋ง๋ ๊ฐ๋ค์ B=10๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๊ฒ ๋ง์ฃผ๋ณด๋ ํฌ ํฌ์ธํฐ
๋ฅผ ์ฌ์ฉํ๋ฉด, ํ๋์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์์ธก ํ ์ ์๋ค.
3. ์ฝ๋ ์๊ฐ ๐
import java.io.*;
import java.util.*;
public class Main {
/* b2143 ๋ ๋ฐฐ์ด์ ํฉ
1. ๊ฐ ๋ฐฐ์ด์ ๊ตฌ๊ฐํฉ ๊ตฌํ๊ธฐ
2. A ๊ตฌ๊ฐํฉ์ ๊ธฐ์ค์ผ๋ก B ๊ตฌ๊ฐํฉ์ ๋ํ๋ค.
3. B ๊ตฌ๊ฐํฉ์ ๋ํ์ ๋, ์ด ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ T๋ฅผ ๋์ด์๋ฉด, A ๊ตฌ๊ฐํฉ์ ์์น๋ฅผ ์ฎ๊ธด๋ค.
*/
public static void main(String[] args) throws IOException {
// 0. ๋ณ์ ๋ชจ์
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T;
int [] A;
int [] B;
int [] sumA;
int [] sumB;
ArrayList<Integer> secA = new ArrayList<>();
ArrayList<Integer> secB = new ArrayList<>();
// 1. ์ด๊ธฐํ
T = Integer.parseInt(br.readLine());
A = new int [Integer.parseInt(br.readLine())+1];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 1; i < A.length; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
B = new int [Integer.parseInt(br.readLine())+1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i < B.length; i++) {
B[i] = Integer.parseInt(st.nextToken());
}
sumA = new int [A.length];
sumB = new int [B.length];
initSums(sumA, A);
initSums(sumB, B);
initSec(secA,sumA);
initSec(secB,sumB);
Collections.sort(secA);
Collections.sort(secB);
// 2. ๊ณ์ฐ
System.out.println(calcul(secA,secB,T));
}
// ๋์ ํฉ ์ด๊ธฐํ ํจ์
public static void initSums (int [] sum, int [] arr){
for (int i = 1; i < sum.length; i++) {
sum[i] = sum[i-1] + arr[i];
}
}
// ๊ตฌ๊ฐํฉ ์ด๊ธฐํ ํจ์
public static void initSec (ArrayList<Integer> sec, int [] sum){
for (int i = 1; i < sum.length; i++) {
for (int j = 0; j < i; j++) {
sec.add(sum[i]-sum[j]);
}
}
}
// ๋ณธ ๊ณ์ฐ ํจ์
public static long calcul(ArrayList<Integer> secA, ArrayList<Integer> secB, int T){
long ans = 0;
int a = 0;
int b = secB.size()-1;
while ( a < secA.size() && b > -1){
int now = secA.get(a) + secB.get(b);
if(now == T){
// ์ต์ด secA.get(a) ๊ฐ ํน์ secB.get(b) ๊ฐ๊ณผ ๊ฐ์ ๊ฐ ์ธ์ด์ ์ค๋ณต๊ฐ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ ์ํจ
long ac = 0; long bc = 0;
long firstA = secA.get(a);
while(a<secA.size() && firstA == secA.get(a)){
a++;
ac++;
}
long firstB = secB.get(b);
while (b > -1 && firstB == secB.get(b)){
b--;
bc++;
}
ans += (ac * bc);
}else if(now < T){
a++;
}else {
b--;
}
}
return ans;
}
}
ํด๋น ํ์ด์์ ๋ฐ๋ก ์ค๋ช ํด์ผํ ํํธ๋ ์๋ง๋ ๊ฐ์ A,B ์กฐํฉ์ ๋ง๋ฌ์ ๋ ์ด๋ป๊ฒ ๋ค๋ฃจ๋๊ฐ? ์ผ ๊ฒ์ด๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ด๋ค. ์ฃผ์ํด์ผํ ์ ์, ์ด ์ค๋ณต๋๋ ์กฐํฉ ์ฌ์ด์์ ๋์ฌ ์ ์๋ ๊ฒฝ์ฐ์ ์๊ฐ ์ฌ๋ฌ๊ฐ์ง ์ด๋ค. ๋ผ๋ ์ ์ด๋ค.
๋งจ ์ผ์ชฝ 2๋ก ํ๊ฒ๊ฐ 9๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ 5๊ฐ์ง์ด๋ค. ์ด๋ ๋๋จธ์ง 2๋ชจ๋ ๋์ผํ๋ค. ๋ฐ๋ผ์ T๋ฅผ ๋ง๋ค ์ ์๋ ์ค๋ณต๋ a๊ฐ๊ณผ b๊ฐ์ผ๋ก ๋ง๋ค ์ ์๋ ํ๊ฒ์ ๊ฐฏ์๋ a * b
๊ฐ ์ด๋ค.
if(now == T){
// ์ต์ด secA.get(a) ๊ฐ ํน์ secB.get(b) ๊ฐ๊ณผ ๊ฐ์ ๊ฐ ์ธ์ด์ ์ค๋ณต๊ฐ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ ์ํจ
long ac = 0; long bc = 0;
long firstA = secA.get(a);
while(a<secA.size() && firstA == secA.get(a)){
a++;
ac++;
}
long firstB = secB.get(b);
while (b > -1 && firstB == secB.get(b)){
b--;
bc++;
}
ans += (ac * bc);
}else if(now < T){
a++;
}else {
b--;
}
๋ฐ๋ผ์ ์์ ๊ฐ์ด T๊ฐ ๋๋ ์กฐํฉ์ ๋ง๋ฌ์ ๊ฒฝ์ฐ, a๊ฐ๊ณผ b๊ฐ์ด ๊ฐ๊ฐ ์ค๋ณต๋๋์ง ์ธ์ด์ค์ผ ํ๋ค. ac
์ bc
๋ ๊ฐ๊ฐ T๊ฐ ๋๋ a์ b๊ฐ ์ค๋ณต๋์ด์ ๋ํ๋์ง ์ด๋ค. ์ค๋ณต๋ ๋๋ง๋ค ๊ฐ์ ์ฌ๋ฆฐ๋ค. ์ดํ, ์ด๋ค ๊ฐ์ ์กฐํฉ์ผ๋ก ๋์ฌ ์ ์๋ T์ ๊ฐ์๋ฅผ ์ธ์ ๋ํด์ค๋ค.
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
์ด๋ฐ์ ํ๋ ธ๋ ์ด์
: ํฌ ํฌ์ธํฐ๋ฅผ ๋จ๋ฐฉํฅ์ผ๋ก๋ง ์๊ฐํ๋ค.
ํ์ง๋ง ๋ฐฐ์ด์ด ๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋จ๋ฐฉํฅ ํฌ ํฌ์ธํฐ๋ก ํ๋ฉด A๊ฐ์ด ๊ฐฑ์ ๋ ๋๋ง๋ค B๊ฐ์ ์ฒ์๋ถํฐ ์์ํด์ผํ๋ค. (T๊ฐ ์ด๋์ ๋์ฌ์ง ์์ธก ๋ถ๊ฐ๋ฅํด์) ์ด๋ ๊ทธ๋ฅ 4์ค ๋ฐ๋ณต๋ฌธ ์์ ํ์์ด ๋๋ค.์ดํ ํ๋ ธ๋ ์ด์
: ์ค๋ณต๋๋ ๊ฐ์ ์กฐํฉ์ด ๋์ฌ ๋,ac * bc
๊ฐ ์๋๋ผac + bc
๋ก ํ์๋ค. ์ฐ์๋๋ ๊ฐ๋ค์ ๊ฒฝ์ฐ์ ์์ด๋ฏ๋ก ๋ํ๊ธฐ๊ฐ ์๋ ๊ณฑํ๊ธฐ๋ก ํ์ด์ผ ํ๋ค. (๊ณ ๋ฑํ๊ต ๋ ํํต ์ํ๋๋ฐ ใ ใ )