3273번: 두 수의 합
n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는
www.acmicpc.net
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int[] input = new int[N];
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str, " ");
for(int i=0; i<N; i++){
input[i] = Integer.valueOf(st.nextToken());
}
int X = Integer.parseInt(br.readLine());
Arrays.sort(input);
int ans = 0;
int start = 0; int end = N-1;
while(start<end){
if(input[start]+input[end] == X){
ans++;
start++;
}
if(input[start]+input[end] > X)
end--;
if(input[start]+input[end] < X)
start++;
}
bw.write(Integer.toString(ans)+'\n');
br.close(); bw.close();
}
}
정렬 + X-input[i]가 배열에 있는지 확인하는 이중 for문으로 풀면 시간초과가 난다.
[투 포인터 방법]
배열의 맨 앞=0, 맨 끝=N-1 를 각각 가르키며 두 원소의 합을 확인한다.
합이 X보다 크거나 작으면, start와 end를 오른쪽으로 이동(start++), 왼쪽으로 이동(end--)하면서 탐색한다.
만약 합이 X와 같으면, 카운트 해주고 탐색을 계속한다.
'1d-1c > BOJ' 카테고리의 다른 글
4963_섬의 개수 (JAVA) (C++) (0) | 2020.11.09 |
---|---|
1182_부분수열의 합 (JAVA) (0) | 2020.11.08 |
1931_회의실배정 (JAVA) (0) | 2020.11.05 |
2108_통계학 (JAVA) (0) | 2020.11.04 |
10989_수 정렬하기3 (JAVA) (0) | 2020.11.03 |