1. ๋ฌธ์ ๋ถ์
N๊ฐ์ ์ ์ค 2๊ฐ๋ฅผ ๋ฝ์์ ๊ทธ๊ฒ M๊ณผ ๋ง๋์ง ๊ณ์ฐํ๋ฉด ๋๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋์ ์กฐํฉ์ ์ฌ์ฉํ๋ค. N์ด 15000๊ฐ๊น์ง ์ฃผ์ด์ง๋ค. 15000C2 = 112492500 ์ด๋ค.
์ฃผ์ด์ง ์๊ฐ์ด 2์ด์์ผ๋ก 20์ต ๋ฒ์ ๊ณ์ฐ์ด ๊ฐ๋ฅํ ์ํฉ์์ 11์ต์ ๊ณ์ฐ์ Safe๋ค. ๋ฐ๋ผ์ ๋จ์ ์กฐํฉ์ ํด๋ ๋ฌธ์ ๋ ํ๋ฆฐ๋ค. (์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ์ง๋ง...)
๋๋ DO IT! ์๊ณ ๋ฆฌ์ฆ ์ฝ๋ฉํ
์คํธ ์ฑ
์์ ์๊ฐํ ํฌ ํฌ์ธํฐ๋ก๋ ๋ฌธ์ ๋ฅผ ํ์ด ๋ณด์๋ค. ํฌ ํฌ์ธํฐ๋ฅผ ์ฐ๋ฉด ์ ๋ ฌ ํ ์ต๋ N+1 ๋ฒ์ ์ฐ์ฐ์ด ํ์ํด์ ์ด N+1 +NlogN = O(NlogN) ์ ์๊ฐ์ด ๋ ๋ค.
์ด๊ฑธ N์ ์ต๋ ๊ฐ์ธ 15000์ผ๋ก ๊ณ์ฐํด๋ณด๋ฉด, 15000 * log(15000) = 62641 ๊ฐ์ ์ฐ์ฐ๋ง ํ๋ฉด ๋์ด์ ํจ์ฌ ๋น ๋ฅด๋ค.
๋ ๋ฐฉ๋ฒ ๋ค ์๊ฐํด๋ณด๊ฒ ๋ค.
2. ํธ๋ ์๋ฆฌ
โ ์กฐํฉ
N๊ฐ ์ค 2๊ฐ๋ฅผ ๋ฝ์์ ๋, ๋ ์์ ํฉ์ด M์ด ๋๋์ง๋ฅผ ๊ณ์ฐํ๋ค.
โ ํฌ ํฌ์ธํฐ
- ๋จผ์ ์ฃผ์ด์ง ์๋ค์ ๋ฐฐ์ด์ ๋ฃ๊ณ ์ ๋ ฌํ๋ค.
- ํฌ์ธํฐ๋ฅผ ๋ฐฐ์ด ๋งจ ์ผ์ชฝ(์ต์๊ฐ), ๋งจ ์ค๋ฅธ์ชฝ(์ต๋๊ฐ)์ ๋๋ค.
- ๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ ์์์ ํฉ์ด M๋ณด๋ค ์์ผ๋ฉด ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ ์ค์์ผ๋ก ํ ์นธ ๋น๊ธด๋ค.
- M๋ณด๋ค ํฌ๋ฉด ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ค์์ผ๋ก ๋น๊ธด๋ค.
- ๋ ํฌ์ธํฐ๊ฐ ๋ง๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
1๋ฒ loop (1 + 8 < 9)
1๋ฒ | 2๋ฒ | 3๋ฒ | 4๋ฒ | 5๋ฒ | 6๋ฒ |
---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 7 |
s | e |
2๋ฒ loop(2 + 7 = 9 (cnt ์นด์ดํธ) )
1๋ฒ | 2๋ฒ | 3๋ฒ | 4๋ฒ | 5๋ฒ | 6๋ฒ |
---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 7 |
s | e |
์ ์ ๋ ฌ ํด์ผํ ๊น?
์ ๋ ฌ์ ํด์ผ์ง M๊ณผ ํฌ์ธํฐ ํฉ๋ค๊ฐ์ ์ ๋น๊ต๊ฐ ์์์ด ๊ฐ๊ณ ๋ด๊ฐ ์ ์ดํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฝ๋๋ฅผ ์งค ์ ์๋ ๊ฒ์ด๋ค.
(์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ฌ๋ฆฌ๋ฉด ํฉ์ด ์ปค์ง๋ค. ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ ๋ด๋ฆฌ๋ฉด ๊ฐ์ด ์์์ง๋ค. ๋ฑ)
3. ์ฝ๋ ๋ถ์
โ ์กฐํฉ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*
* 1940๋ฒ ์ฃผ๋ชฝ
* */
public class Main {
static int N, M;
static int [] arr;
static int [] target = new int [2];
static int cnt = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 1. ๊ฐ ๋ฐ๊ธฐ
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
combination(0,0);
System.out.println(cnt);
}
public static void combination (int depth, int start) {
if(depth == 2){
int ans = 0;
for (int i = 0; i < target.length; i++) {
ans +=target[i];
}
if(ans == M) {
cnt ++;
}
return;
}
for (int i = start; i < N; i++) {
target[depth] = arr[i];
combination(depth+1, i+1);
}
}
}
โ ํฌ ํฌ์ธํฐ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/*
* 1940๋ฒ ์ฃผ๋ชฝ
* */
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
int [] arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int start = 0, end = N-1, cnt = 0;
while (start != end) {
int value = arr[start] + arr[end];
if(value > M){
end--;
} else if (value == M) {
cnt ++;
end --;
} else {
start ++;
}
}
System.out.println(cnt);
}
}