Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Binaryseop

[백준 9024] 두 수의 합 Java 풀이 본문

알고리즘

[백준 9024] 두 수의 합 Java 풀이

Binaryseop 2024. 4. 23. 01:42
 

9024번: 두 수의 합

프로그램은 표준입력으로 입력을 받는다. 프로그램 입력은 t 개의 테스트 케이스로 구성된다. 입력의 첫 번째 줄에 테스트 케이스의 개수를 나타내는 정수 t 가 주어진다. 두 번째 줄부터 두 줄

www.acmicpc.net

 

접근

n이 최대 1,000,000이므로 이중 for 문으로 문제를 풀 경우 시간 복잡도가 O(n^2)이 되어 시간 초과가 발생합니다. 따라서 투 포인터 기법을 이용하여 시간 복잡도를 O(n)으로 줄여 문제를 해결해야 합니다.

 

풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
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));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;

		int t = Integer.parseInt(br.readLine());
		while (t-- > 0) {
			st = new StringTokenizer(br.readLine());
			int n = Integer.parseInt(st.nextToken());
			int k = Integer.parseInt(st.nextToken());

			int[] arr = new int[n];

			st = new StringTokenizer(br.readLine());
			for (int i = 0; i < n; i++) {
				arr[i] = Integer.parseInt(st.nextToken());
			}

			// 1. 배열 arr를 오름차순으로 정렬한다.
			Arrays.sort(arr);

			// 2. 투 포인터를 이용하여 k에 가장 가까운 두 정수의 조합의 수를 구한다.
			int left = 0, right = n - 1, count = 0;
			int minDiff = Integer.MAX_VALUE;
			while (left < right) {
				int sum = arr[left] + arr[right];
				int diff = Math.abs(k - sum);

				if (diff < minDiff) {
					minDiff = diff;
					count = 1;
				} else if (diff == minDiff) {
					count++;
				}

				if (sum > k) {
					right--;
				} else if (sum < k) {
					left++;
				} else {
					left++;
					right--;
				}
			}
			sb.append(count).append("\n");
		}

		// 결과 출력
		System.out.println(sb);
	}
}

'알고리즘' 카테고리의 다른 글

[백준 11720] 숫자의 합 Java 풀이  (0) 2024.05.13
[백준 14502] 연구소 문제 풀이  (0) 2024.04.28
[백준 2559] 수열 Java 풀이  (0) 2024.04.22
[백준 1940] 주몽 Java 풀이  (0) 2024.04.22
[백준 2467] 용액 Java 풀이  (0) 2024.04.21