
받은 배열에서 두 수를 더해서 타겟이 되는 서로 다른 두 인덱스를 찾는 문제
이중 for문으로 간단하게 풀 수 있는 문제지만, 투포인터라는 개념을 활용하여 풀어보려고 한다.
투포인터란 배열에서 특정 조건을 만족하는 부분 구간을 효율적으로 탐색하는 알고리즘(일반적으로 정렬되어 있을 때 사용)
왼쪽 끝이 시작 포인터, 오른쪽 끝이 끝 포인터
이 때 조건에 따라 왼쪽과 오른쪽 포인터를 이동시키며 결과를 도출
만약 왼쪽이 오른쪽을 넘어간다면 실패
class Solution {
public int[] twoSum(int[] nums, int target) {
//값, 인덱스 형태의 원래 인덱스 보존 이차원 배열
int[][] arr = new int[nums.length][2];
for (int i=0; i<nums.length; i++) {
arr[i][0] = nums[i]; //값
arr[i][1] = i; //인덱스
}
//arr을 값 기준으로 오름차순 정렬
Arrays.sort(arr, (o1, o2) -> o1[0] - o2[0]);
//투 포인터 지정
int start = 0;
int end = nums.length - 1;
while (start < end) {
//두 값의 합이 target보다 작으면 start를 오른쪽으로 이동
if (arr[start][0] + arr[end][0] < target) {
start++;
}
//두 값의 합이 target보다 크면 end를 왼쪽으로 이동
else if (arr[start][0] + arr[end][0] > target) {
end--;
}
//같으면 원래 인덱스 반환
else {
return new int[] {arr[start][1], arr[end][1]};
}
}
//target과 같은 값이 안나오면 실패
return new int[] {-1, -1};
}
}