문제
n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj)쌍의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수열의 크기 n이 주어진다. 다음 줄에는 수열에 포함되는 수가 주어진다. 셋째 줄에는 x가 주어진다. (1 ≤ n ≤ 100000, 1 ≤ x ≤ 2000000)
출력
문제의 조건을 만족하는 쌍의 개수를 출력한다.
예제 입력 1
9
5 12 7 10 9 1 2 3 11
13
예제 출력 1
3
문제접근
2개 원소의 합을 구하여 일치하는 해를 구하면 되는 문제임으로 2개의 포인터를 주어 접근하면 되겠다는 생각이 들었다.
- 입력 받은 자연수를 배열로 오름차순 정렬한다.
- loop를 돌면서 가장 작은 값의 인덱스 i , 가장 큰 값의 인덱스 j를 두어 두 수를 합한다.
- 두개의 값을 합하여 결과를 비교한다.
- 구하자는 값인 경우 -> i++ j-- answer++
- 구하고자 하는 값보다 작은 경우 -> i++
- 구하고자 하는 값보다 큰 경우 -> j--
- loop는 i와 값이 j의 값보다 크거나 같은 경우 중단하며 answer를 반환한다.
문제풀이
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int[] arr = new int[N];
for(int i = 0; i < N; i++)
arr[i] = Integer.parseInt(st.nextToken());
int sum = Integer.parseInt(br.readLine());
Arrays.sort(arr); //#1
int answer = 0;
int i = 0;
int j = N-1;
int temp;
while(i < j) { //#2
temp = arr[i] + arr[j];
if(temp == sum) { //#3
answer++;
i++;
j--;
}else if(temp < sum) {
i++;
}else {
j--;
}
}
bw.write(answer +""); //#4
bw.flush();
br.close();
bw.close();
}
}
'Study > BOJ - 풀이' 카테고리의 다른 글
백준 - 11399 (Java) (2249) | 2023.09.27 |
---|---|
백준 - 1541 (Java) (2246) | 2023.09.27 |
백준 - 12891 (Java) (2238) | 2023.09.27 |
백준 - 12847 (Java) (2257) | 2023.09.27 |
백준 - 2470 (Java) (1648) | 2023.09.26 |