알고리즘
[LeetCode] 1. Two Sum (Java 문제풀이)
DEV숨
2024. 3. 15. 22:20
문제링크: https://leetcode.com/problems/two-sum/
Problem
주어진 문제는 주어진 배열의 두 숫자를 골라 더했을 때 target이 되는 숫자들의 index를 구하는 문제이다.
Solution
먼저 HashMap에 숫자를 key, index를 value로 집어넣는다.
이 때 중복값이 허용되므로 같은 숫자가 존재할 경우에 가장 마지막 숫자의 index가 value로 들어간다.
예) 숫자배열이 num: [1, 3, 5, 5, 8], target: 10이라고 한다면
생성된 HashMap은 {1:0, 3:1, 5:3, 8:4}이런 모양새가 된다.
이제 다시 숫자배열을 0번 index 부터 돌면서 target - num[index] 의 값이 생성한 HashMap의 key에 존재하는지 확인한다.
- index 0, num[0]: target - num[0] == 10 - 1 == 9. 9는 HashMap의 key 에 존재하지 않아서 pass.
- index 1, num[1]: target - num[1] == 10 - 3 == 7. 7은 HashMap의 key 에 존재하지 않아서 pass.
- index 2, num[2]: target - num[2] == 10 - 5 == 5. 5는 HashMap의 key 에 존재한다. key:5 value:3
즉 정답이 되는 두 index는 2와 3이다.
정답: [2, 3]
정답코드
class Solution {
public int[] twoSum(int[] nums, int target) {
final var map = new HashMap<Integer, Integer>();
for (int i = 0 ; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
final var exactNumber = target - nums[i];
if (map.containsKey(exactNumber) && map.get(exactNumber) != i) {
return new int[]{i, map.get(exactNumber)};
}
}
return new int[]{0, 0};
}
}
ps. 이번처럼 정답이 5, 5인 경우? index는 늘 0부터 커지는 방향으로 움직이고, HashMap에 저장될 때 key값이 중복될 경우 가장 마지막의 index값이 value로 저장된다. 그러므로 for문의 i 값이 먼저, HashMap의 value 값이 뒤에오게 제출하면 된다.