본문 바로가기
Algorithm

백준 3273번 <두 수의 합> with 이진탐색

by seungh2 2022. 5. 2.

백준 알고리즘 3273번

https://www.acmicpc.net/problem/3273

 

3273번: 두 수의 합

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

www.acmicpc.net


3273번

n개의 서로 다른 양의 정수로 이루어진 수열 a와 자연수 x가 주어졌을 때, ai + aj = x를 만족하는 (ai, aj) 쌍의 수를 구하여라.

 

입력으로 첫 줄에 수열의 크기 n이 주어지고 그 다음 줄에 수열에 포함되는 n개의 수가 주어진다. 셋째 줄에는 x가 주어진다.

 

출력으로 ai + aj = x를 만족하는 쌍의 개수를 구해서 출력하면 된다.


문제 해결

이진 탐색으로 문제를 해결했다.

수열이 n개의 서로 다른 양의 정수로 이루어졌기 때문에 ai + aj = x를 만족하는 쌍은 ai에 대해 하나의 aj 값을 갖는다.

 

각 수열의 값을 기준으로 이진 탐색을 하는데 이때 찾는 데이터는 x - ai의 값이다.

중복으로 찾는 경우를 방지하기 위해 visit 배열을 통해 이미 찾은 쌍의 숫자는 표시를 해두었다.

(이진 탐색은 정렬되어 있는 것을 기준으로 하기 때문에 수열을 정렬해야 한다.)


코드

package bj3273;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	static int[] number;
	static boolean[] visit;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		String[] inArr = br.readLine().split(" ");
		int x = Integer.parseInt(br.readLine());
		number = new int[n];
		visit = new boolean[n];
		if (n == 1) {
			System.out.println(0);
			System.exit(0);
		}
		for (int i = 0; i < n; i++) {
			number[i] = Integer.parseInt(inArr[i]);
			visit[i] = false;
		}
		Arrays.sort(number);
		int answer = 0;
		for (int i = 0; i < n; i++) {
			if (visit[i]) {
				continue;
			}
			int data = x - number[i];
			int idx = BS(n, data);
			if (idx == -1 || idx == i) {
				continue;
			}
			visit[i] = true;
			visit[idx] = true;
			answer++;
		}
		System.out.println(answer);

	}

	public static int BS(int n, int data) {
		int start = 0;
		int end = n - 1;
		while (start <= end) {
			int mid = (start + end) / 2;
			if (number[mid] > data) {
				end = mid - 1;
			} else if (number[mid] == data) {
				return mid;
			} else {
				start = mid + 1;
			}
		}
		return -1;
	}

}

결과


 

728x90

'Algorithm' 카테고리의 다른 글

백준 10773번 <제로>  (0) 2022.05.02
백준 3273번 <두 수의 합> with 2 pointer  (0) 2022.05.02
백준 1940번 <주몽>  (0) 2022.05.02
백준 2230번 <수 고르기>  (0) 2022.05.01
백준 18870번 <좌표 압축>  (0) 2022.05.01

댓글