b.3273 ๋ ์์ ํฉ
https://www.acmicpc.net/problem/3273
๐ ์๋ฐ(Java)๋ก ํธ๋ ๋ ์์ ํฉ ๋ฌธ์ - ๋ฐฑ์ค 3273
๐ ๋ฌธ์ ๊ฐ์
๋ฐฑ์ค 3273๋ฒ - ๋ ์์ ํฉ ๋ฌธ์ ์ ๋๋ค.
์ ์ N๊ฐ๋ก ์ด๋ฃจ์ด์ง ์์ด์ด ์ฃผ์ด์ง ๋,
์๋ก ๋ค๋ฅธ ๋ ์๋ฅผ ๋ํด์ target์ด ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
• ํ ์์ ํ ๋ฒ๋ง ์
• ์ค๋ณต ์์ด, ์ค๋ฆ์ฐจ์ ๋๋ ๋ด๋ฆผ์ฐจ์ ์๊ด์์ด ์์ ๊ตฌ์ฑ
๐ก ์์ ์ ๋ ฅ
9
5 12 7 10 9 1 2 3 11
13
๐ก ์์ ์ถ๋ ฅ
3
โก 5+8, 1+12, 2+11 ์ด 3์์ด ์กด์ฌ
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์
์ด ๋ฌธ์ ๋ ๋ํ์ ์ธ ํฌ ํฌ์ธํฐ(Two Pointer) ๊ธฐ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
โ๏ธ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ
• ๋ฐฐ์ด์ ์ ๋ ฌํ ํ, ์ผ์ชฝ ํฌ์ธํฐ(left)์ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ(right) ๋ฅผ ์ ๋์ ๋ฐฐ์น
• ํฉ์ด target๋ณด๋ค ํฌ๋ฉด right๋ฅผ ์ผ์ชฝ์ผ๋ก,
• ์์ผ๋ฉด left๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
• ์ ํํ ๊ฐ์ผ๋ฉด ์ ๋ต(answer)์ +1 ํ ์์ชฝ ํฌ์ธํฐ ์ด๋
๐น Java ์ฝ๋ ํด์ค
import java.io.*;
import java.util.*;
public class Main {
static int N, target, answer;
static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
target = Integer.parseInt(br.readLine());
answer = 0;
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr); // ํฌํฌ์ธํฐ๋ฅผ ์ํด ์ ๋ ฌ
int left = 0, right = N - 1;
while (left < right) {
int sum = arr[left] + arr[right];
if (sum == target) {
answer++;
left++;
right--;
} else if (sum > target) {
right--;
} else {
left++;
}
}
System.out.println(answer);
}
}
๐ ์ฝ๋ ์ค๋ช
๐ 1. ์ ๋ ฅ ์ฒ๋ฆฌ ๋ฐ ๋ฐฐ์ด ์ ๋ ฌ
N = Integer.parseInt(br.readLine());
arr = new int[N];
// ...
Arrays.sort(arr);
โ ์ ๋ ฅ๋ ์์ด์ ์ ์ ๋ฐฐ์ด๋ก ์ ์ฅํ๊ณ ์ ๋ ฌ
โ ์ ๋ ฌ์ ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๊ธฐ ์ํ ์ ์ฒ๋ฆฌ ์์
๐ 2. ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ
int left = 0, right = N - 1;
while (left < right) {
int sum = arr[left] + arr[right];
if (sum == target) {
answer++;
left++;
right--;
} else if (sum > target) {
right--;
} else {
left++;
}
}
โ left + right == target์ธ ๊ฒฝ์ฐ, ์ ๋ต์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์์ชฝ ํฌ์ธํฐ๋ฅผ ์ด๋
โ ํฉ์ด ๋๋ฌด ํฌ๋ฉด right ๊ฐ์, ์์ผ๋ฉด left ์ฆ๊ฐ
โ ์ค๋ณต ์์ด ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ ๊ฐ๋ฅ
๐ ์ ๋ฆฌ
โ ํต์ฌ ํฌ์ธํธ
โ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ํ์ฉํ ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ
โ ์ค๋ณต ์์ด ๋ ์์ ํฉ์ด target์ด ๋๋ ๊ฒฝ์ฐ์ ์ ๊ณ์ฐ
โ O(NlogN) ์ ๋ ฌ + O(N) ํ์์ผ๋ก ํจ์จ์ ์ธ ํด๊ฒฐ
๐ฏ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฅ์
โ ์๊ฐ ์ ํ์ด ์๊ฒฉํ ์ํฉ์์๋ ๋น ๋ฅด๊ฒ ๋์
โ ๋ฐฐ์ด ๋ด์์ ์กฐ๊ฑด์ ๋ง๋ ์์ ํจ์จ์ ์ผ๋ก ์ฐพ์ ์ ์์
โ ๊ธฐ์ด์ ์ธ ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ ํ์ต์ ์ ํฉํ ๋ํ ๋ฌธ์
์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด ์ข์์์ ๊ณต์ ๋ถํ๋๋ฆฝ๋๋ค! ๐