smooth waters run deep

1d-1c/BOJ

3273_두 수의 합 (JAVA)

yeon_11 2020. 11. 7. 22:27
 

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