Tags
- Study
- Brute Force Algorithm
- CodingTest
- ์ํ
- ์๋ฎฌ๋ ์ด์
- ์ ๋ ฌ
- ๊ทธ๋ํ ์ด๋ก
- Java
- queue
- sort
- ์๋ฃ๊ตฌ์กฐ
- greedy
- BFS
- LV2
- BOJ
- ์ ์๋ก
- ๋๋น ์ฐ์ ํ์
- ๊ต์ฌ
- Python
- ๊น์ด ์ฐ์ ํ์
- ๊ทธ๋ํ ํ์
- stack
- ๊ตฌํ
- ๋ฐฑํธ๋ํน
- DP
- ๋ฌธ์์ด
- dfs
- SpringBoot
- Dynamic Programming
- PGM
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_2143 : ๋ ๋ฐฐ์ด์ ํฉ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- ๋ ๋ฐฐ์ด A์ B์ ๋ถ๋ฐฐ์ด์ ํฉ์ผ๋ก T๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ธ ๋ฌธ์ ํ์ด ๐ธ
- ๋ถ๋ฐฐ์ด์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋์ ํฉ์ ์ด์ฉํ๋ค.
- ์ ๋ ฅ ๋ฐฐ์ด์ ์์๋ ์ต๋ 1,000์ด๋ฏ๋ก, intํ์ผ๋ก 2๊ฐ์ ๋ฐฐ์ด์ ์ ์ธํด์ 2,000 x 4Byte = 8KB๊ฐ ์ฐ์ธ๋ค.
- ๋ฐฐ์ด A์ B์ ๋์ ํฉ์ ๋ง๋ ๋ค, ๋ชจ๋ ๋ถ๋ฐฐ์ด์ ํฉ์ ๊ตฌํ๋ค.
- A์ ๋ถ๋ฐฐ์ด์ ์๋ A์ ์์ ์ n๊ฐ ์ค์์ ์์๊ณผ ๋ ์ธ๋ฑ์ค 2๊ฐ์ง๋ฅผ ๋ฝ๋ ๊ฒฝ์ฐ์ ์์ด๋ค. ์ด๋ ์ค๋ณต ๊ฐ๋ฅํ๋ค.
์ค๋ณต ์กฐํฉ ๊ณต์ nHr = (n+r-1)! / r!(n-1)! ์์ r=2 ์ด๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค.
(n+1)! / 2(n-1)!
= n(n+1) / 2 - ๋ฐ์ง๊ณ ๋ณด๋ฉด 1~n๊น์ง์ ํฉ์ ๊ตฌํ๋ ์ดํญ๊ณ์์ ๊ณต์๊ณผ ๊ฐ๋ค. 2์ค for๋ฌธ์ ๋ดค์๋ ๋ ์ง๊ด์ ์ผ๋ก ์ ์ ์๋๋ฐ, ์์ชฝ for๋ฌธ์ ๋ฐ๋ณต ์๊ฐ n, n-1, n-2, ... , 1 ์์ผ๋ก ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฌ๊ธฐ์๋ n์ด ์ต๋ 1000์ด๋ฏ๋ก, 1000 * 1001 / 2 ํด์ ์ต๋ ๋ฐฐ์ด ์๊ฐ 500,500 ์ด๊ณ , A B 2๊ฐ๋๊น 1,001,000์ ๋ฐฐ์ด์ด ํ์ํ๋ค.
int๋ก ๋ฐ์ง๋ฉด 4,004,000๋ฐ์ดํธ = 4,004KB = ์ฝ 4MB ์ด๋ค. ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ์ฌ์ ๋กญ๋ค.
- A์ ๋ถ๋ฐฐ์ด์ ์๋ A์ ์์ ์ n๊ฐ ์ค์์ ์์๊ณผ ๋ ์ธ๋ฑ์ค 2๊ฐ์ง๋ฅผ ๋ฝ๋ ๊ฒฝ์ฐ์ ์์ด๋ค. ์ด๋ ์ค๋ณต ๊ฐ๋ฅํ๋ค.
- ๋ง์ง๋ง์ผ๋ก A์ ๋ถ๋ฐฐ์ด๊ณผ B์ ๋ถ๋ฐฐ์ด์ ํฉ์ด T๊ฐ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ค.
- ๋ ํฉ์ด T๊ฐ ๋๋๋ก ๋งค์นญ์ํค๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ํฌ ํฌ์ธํฐ์ ์ด์งํ์ ๋ฐฉ๋ฒ์ด ์๋ค.
- ํฌ ํฌ์ธํฐ๋ O(n)์ธ๋ฐ, ์ฌ๊ธฐ์๋ ์ค๋ณต ์์๋ ์ฒ๋ฆฌํด ์ฃผ์ด์ ๋น ๋ฅด๊ฒ ํ์ํ ์ ์๋ค.
- ๋ค์๊ณผ ๊ฐ์ ๊ณต์์ผ๋ก ๊ณ์ฐํ๋ค.
sum = subA[left] + subB[right]
- ๋ ๋ถ๋ฐฐ์ดํฉ์ ํฉ์ด T์ ๊ฐ์ผ๋ฉด, ์ค๋ณต ์์๊น์ง ํ์ธํด์ ์นด์ดํธํ๋ค.
- T๋ณด๋ค ํฌ๋ฉด right - 1
- T๋ณด๋ค ์์ผ๋ฉด left +1
- ๋ค์๊ณผ ๊ฐ์ ๊ณต์์ผ๋ก ๊ณ์ฐํ๋ค.
- ์ด์งํ์์ ํ๊ท O(logn)์ด์ง๋ง, ์ฌ๊ธฐ์๋ ์ค๋ณต ์์ ๋๋ฌธ์ 4๋ฒ์ฉ ์ฌ์ฉํด์ผ ํด์ ํฌ ํฌ์ธํฐ๋ณด๋ค ๋๋ฆฐ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
- subA[i]๋ฅผ ๊ธฐ์ค๊ฐ as๋ก ์ค์ ํ๋ค. as = subA[i]
- subA์์ as์ ์ผ์นํ๋ ๊ตฌ๊ฐ์ ๊ธธ์ด(์ผ์นํ๋ ์์ ์)๋ฅผ ๊ตฌํ๋ค.
- aTerm = upper_bound(subA, as) - lower_bound(subA, as)
- upper_bound๋ as๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด์ ๊ฐ์ฅ ๊ฐ๊น์ด ์, lower_bound๋ as๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด์ ๊ฐ์ฅ ๊ฐ๊น์ด ์๋ฅผ ๊ตฌํ๋ค.
- ์ด๋ as์ ์ผ์นํ๋ ์์๊ฐ ์ฌ๋ฌ๊ฐ ์ด๋ฉด, ๊ทธ ์๋ฅผ ์๋ ค์ฃผ๊ฒ ๋๋ค.
- ๋ง์ฝ as์ ์ผ์นํ๋ ์์๊ฐ ์๋ค๋ฉด, ๋๊ฐ์ด right๋ฅผ ๋ฐํํด aTerm์ 0์ด ๋์ด ๋ฒ๋ฆฐ๋ค.
- bTerm๋ T-as๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ตฌํด์ aTerm๊ณผ ๊ณฑํ๋ฉด, ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ ์ ์๋ค.
- subA์ ์์๋ฅผ ํ๋์ฉ ๊ธฐ์ค์ผ๋ก ๋ฃ์ด๋ณด๋ฉฐ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋์ ํ๋ค.
๐ธ ํฌ ํฌ์ธํฐ ์ฝ๋ ๐ธ
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = null;
int T = Integer.parseInt(br.readLine());
int n = Integer.parseInt(br.readLine());
int[] A = new int[n + 1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= n; i++) {
A[i] = Integer.parseInt(st.nextToken()) + A[i - 1]; // ๋์ ํฉ
}
int m = Integer.parseInt(br.readLine());
int[] B = new int[m + 1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= m; i++) {
B[i] = Integer.parseInt(st.nextToken()) + B[i - 1]; // ๋์ ํฉ
}
// ๋ชจ๋ ๋ถ๋ฐฐ์ด์ ํฉ ๊ตฌํ๊ธฐ
int[] subA = new int[n * (n + 1) / 2]; // nC2 : ๋ถ๋ฐฐ์ด ์์๊ณผ ๋ ์ธ๋ฑ์ค ๋ฝ๊ธฐ
int[] subB = new int[m * (m + 1) / 2]; // mC2
int idx = 0;
for (int i = 1; i <= n; i++) { // A๋ฐฐ์ด ๋ถ๋ฐฐ์ด ๊ตฌํ๊ธฐ
for (int j = i; j <= n; j++) {
subA[idx++] = A[j] - A[i - 1]; // ๋ถ๋ฐฐ์ด์ ํฉ ์ ์ฅ
}
}
idx = 0;
for (int i = 1; i <= m; i++) { // B๋ฐฐ์ด ๋ถ๋ฐฐ์ด ๊ตฌํ๊ธฐ
for (int j = i; j <= m; j++) {
subB[idx++] = B[j] - B[i - 1]; // ๋ถ๋ฐฐ์ด์ ํฉ ์ ์ฅ
}
}
// ํฌ ํฌ์ธํฐ
Arrays.sort(subA);
Arrays.sort(subB);
int left = 0;
int right = subB.length - 1;
long answer = 0;
while (left < subA.length && right >= 0) {
long as = subA[left];
long bs = subB[right];
long sum = as + bs;
if (sum == T) {
long ac = 0; // ๊ฐ์ ๊ฐ ์นด์ดํธ
long bc = 0;
while (left < subA.length && as == subA[left]) {
left++;
ac++;
}
while (right >= 0 && bs == subB[right]) {
right--;
bc++;
}
answer += ac * bc;
} else if (sum > T) {
right--;
} else {
left++;
}
}
// Output
bw.write(Long.toString(answer));
bw.flush();
}
}
๐ธ ์ด๋ถ ํ์ ์ฝ๋ ๐ธ
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = null;
int T = Integer.parseInt(br.readLine());
int n = Integer.parseInt(br.readLine());
int[] A = new int[n + 1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= n; i++) {
A[i] = Integer.parseInt(st.nextToken()) + A[i - 1]; // ๋์ ํฉ
}
int m = Integer.parseInt(br.readLine());
int[] B = new int[m + 1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= m; i++) {
B[i] = Integer.parseInt(st.nextToken()) + B[i - 1]; // ๋์ ํฉ
}
// ๋ชจ๋ ๋ถ๋ฐฐ์ด์ ํฉ ๊ตฌํ๊ธฐ
int[] subA = new int[n * (n + 1) / 2]; // nC2 : ๋ถ๋ฐฐ์ด ์์๊ณผ ๋ ์ธ๋ฑ์ค ๋ฝ๊ธฐ
int[] subB = new int[m * (m + 1) / 2]; // mC2
int idx = 0;
for (int i = 1; i <= n; i++) { // A๋ฐฐ์ด ๋ถ๋ฐฐ์ด ๊ตฌํ๊ธฐ
for (int j = i; j <= n; j++) {
subA[idx++] = A[j] - A[i - 1]; // ๋ถ๋ฐฐ์ด์ ํฉ ์ ์ฅ
}
}
idx = 0;
for (int i = 1; i <= m; i++) { // B๋ฐฐ์ด ๋ถ๋ฐฐ์ด ๊ตฌํ๊ธฐ
for (int j = i; j <= m; j++) {
subB[idx++] = B[j] - B[i - 1]; // ๋ถ๋ฐฐ์ด์ ํฉ ์ ์ฅ
}
}
// ์ด๋ถ ํ์
Arrays.sort(subA);
Arrays.sort(subB);
long answer = 0;
for (int i = 0; i < subA.length; i++) {
long as = subA[i];
long aTerm = upper_bound(subA, as) - lower_bound(subA, as);
long bTerm = upper_bound(subB, T - as) - lower_bound(subB, T - as);
answer += aTerm * bTerm;
i += (int) (Math.abs(aTerm) - 1);
}
// Output
bw.write(Long.toString(answer));
bw.flush();
}
private static int upper_bound(int[] arr, long t) {
int left = 0, right = arr.length;
while (left < right) {
int mid = (left + right) / 2;
if (t >= arr[mid]) {
left = mid + 1;
} else {
right = mid;
}
}
return right;
}
private static int lower_bound(int[] arr, long t) {
int left = 0, right = arr.length;
while (left < right) {
int mid = (left + right) / 2;
if (t <= arr[mid]) {
right = mid;
} else {
left = mid + 1;
}
}
return right;
}
}
๐ธ end ๐ธ
- ํฌ ํฌ์ธํฐ ํ์ด์์, as์ bs์ ๊ณฑ์ด int๋ฒ์๋ฅผ ๋์ด์๋ฉด์ 68% ํ๋ ธ๋ค.
- n๊ณผ m์ด 1,000 ์ผ ๋, subA์ sub์ ํฌ๊ธฐ๊ฐ 500,500์ด ๋๊ณ , ์ ๊ณฑํ๋ฉด 250,500,250,000๊ฐ ๋์ค๊ธฐ๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ฐฑ์ค ์ง๋ฌธ๊ธ์์ ์์ธ์ ์ ์ ์์๋ค.
- ์๊ณ ๋ฆฌ์ฆ์ ์ต๋ํ ์๊ฐํด ๋ณด์๋๋ฐ, ๋์ ํฉ๊น์ง๋ ์๊ฐํ๊ณ n์ด 1,000์ด๋๊น ์ด๋ถ ํ์์ ์ด์ฉํด์ผ ํ์ง ์์๊น ์๊ฐํ๋ค๊ฐ ์ ์ฉ ๋ฒ์ ๋ ์ฌ๋ฆฌ์ง ๋ชปํด ํ์ด ํฌ์คํ
์ ์ฐธ๊ณ ํ๋ค.
- ๋์ ํฉ ๋์ ํฌ ํฌ์ธํฐ๋ฅผ ๋จผ์ ๋ ์ฌ๋ ธ๋ค๊ฐ ์ ๋ ฌ์ด ๋์ด์์ง ์์์ ์๋๋ค ์ถ์๋๋ฐ, ํฉ์ด T๊ฐ ๋๋ ๋ ์์ ์ฐพ๊ธฐ์์ ๋ค์ ์ฐ์ผ ์ค ๋ชฐ๋๋ค.
- ์ด๋ถ ํ์ ํ์ด๋ ์๋กญ๊ฒ ์๊ฒ๋ ๋ถ๋ถ์ด์๋๋ฐ, ๋ฒ์๋ฅผ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๊ตฌํ ์ ์๋ค๋๊ฒ ๋๋ผ์ ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_1707 : ์ด๋ถ ๊ทธ๋ํ (0) | 2024.04.13 |
---|---|
BOJ_3190 : ๋ฑ (0) | 2024.04.11 |
BOJ_1644 : ์์์ ์ฐ์ํฉ (0) | 2024.04.09 |
BOJ_12015 : ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2 (0) | 2024.04.09 |
BOJ_1005 : ACM Craft (0) | 2024.04.04 |