오름차순으로 더해진 numbers 배열에서 합이 target이 되는 두개의 수를 골라 return
left = 0, right = numbers.length - 1
while left < right:
total = numbers[left] + numbers[right]
if total과 target이 같다면
return [left + 1, right + 1]
if total이 target보다 작다면
left++
else # total > target
right++
class Solution {
public int[] twoSum(int[] numbers, int target) {
for (int left = 0, right = numbers.length - 1; left < right; ) {
if (numbers[left] + numbers[right] == target) {
return new int[] {left + 1, right + 1};
}
if (numbers[left] + numbers[right] < target) {
left++;
} else {
right--;
}
}
return new int[] {};
}
}
투포인터 풀이말고도 HashMap을 이용한 풀이가 있었다. numbers 배열을 순회하면서 map에 numbers[i] = i + 1 을 저장하고 target - numbers[i]가 map에 존재하는 경우, {map[target - numbers[i], i + 1}을 리턴하는 방식이다.
map = dict()
for i in range(n):
if target - numbers[i] in map:
return [map[target - numbers[i], i + 1]
map[numbers[i]] = i + 1
target - numbers[i]를 찾는 이유는 target을 만드려면 numbers[i]이외에 다른 하나는 target - numbers[i]이다. 하나의 수가 map에 존재하면 target이 만들어지는 점을 이용한 것 같다.