백준 3273 - 두 수의 합
Updated:
Java
3273 번 - 두 수의 합
문제
접근 방법
2가지 방법으로 해결하였다.
첫 번째 방법
정렬 후에 각 수의 존재 여부를 나타내는 boolean 배열을 통해 쌍을 구한다.
두 번째 방법
정석 투포인터로 해결
코드 - boolean[]
import java.util.*;
import java.io.*;
public class Main {
static int n, x, result, MAX_SIZE = 2000001;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = stoi(br.readLine());
StringTokenizer stk = new StringTokenizer(br.readLine());
x = stoi(br.readLine());
int[] arr = new int[n];
boolean[] isIn = new boolean[MAX_SIZE];
for(int i = 0; i < n; i++) {
arr[i] = stoi(stk.nextToken());
isIn[arr[i]] = true; // 값이 있는지 확인
}
Arrays.sort(arr);
int idx;
for(int i = 0; i < n; i++) {
if(arr[i] > x / 2) // 찾으려는 x의 절반 크기보다 더 큰 경우 쌍을 찾을 수 없다.
break;
idx = x - arr[i];
if(isIn[idx] && x / 2 != idx) // 반대편 쌍과, 그 쌍이 현재 값과 다를 시
result++;
}
System.out.println(result);
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}
코드 - 투 포인터
import java.util.*;
import java.io.*;
public class Main {
static int n, x, result, MAX_SIZE = 2000001;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("res/mainInput.txt")); //제출 할 때 주석해야함
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = stoi(br.readLine());
StringTokenizer stk = new StringTokenizer(br.readLine());
x = stoi(br.readLine());
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = stoi(stk.nextToken());
}
Arrays.sort(arr);
int s = 0,e = n - 1, sum;
while(s < e) {
sum = arr[s] + arr[e];
if(sum == x) { // x와 같으면 답++
result++;
s++;
e--;
}
else if(sum < x) { // x가 더 크면, 왼쪽 인덱스 증가
s++;
}
else { // x가 더 작으면, 오른쪽 인덱스 증가
e--;
}
}
System.out.println(result);
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}