반응형
오늘의 문제.
Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.You may assume that each input would have exactly one solution, and you may not use the same element twice.You can return the answer in any order.
정수 배열인 nums와 정수 target이 주어진다.
더하면 target값이 되는 두 숫자의 인덱스를 리턴하라.한가지 배열 요소를 두 번 이상 사용하지 않는다.
솔루션은 하나뿐이라고 가정할 수 있다.
답안을 어떤 순서대로 리턴해도 상관 없다.
Constraints
1. 2 <= nums.length <= 10^3
2. -10^9 <= nums[i] <= 10^9
3. -10^9 <= target <= 10^9
4. 오직 하나의 답안만 존재함
오늘건 금방 풀렸다.
public int[] twoSum(int[] nums, int target) {
int[] answer=new int[2];
//답안 배열 생성
for(int i=0; i<nums.length; i++){
for(int j=i+1; j<nums.length; j++){ //i와 중복되면 안되니까
if(nums[i]+nums[j] == target){
answer[0] = i;
answer[1] = j;
return answer;
}
}
}
return answer;
}
그런데 for문 안에서 return을 하나 써주고, 써주지 않는 것만으로도 속도 차이가 11ms나 났다. 그 자리에 break문을 써도 9ms. 바로 리턴문을 써주면 0ms. 음... 신기방기.
한번 풀고서는 해시맵을 써서 다시 풀어보고 싶었는데 생각처럼 잘 안 돼서 디스커션을 참고했다. 이전에 보았던 key값으로 value 뽑기, value값으로 key 뽑기 모범답안이 있어서 가져왔다.
public int[] twoSum2(int[] nums, int target) {
Map<Integer, Integer> ansMap=new HashMap<>();
for(int i=0; i<nums.length; i++){
if(ansMap.containsKey(target-nums[i])){
return new int[] {ansMap.get(target-nums[i]), i}; //있으면 해당 키와 i를 배열로 리턴
}else{
ansMap.put(nums[i], i); //target과 nums[i]의 차에 해당하는 값이 없으면 맵에 넣어라
}
}
return null;
}
- mapName.containsKey(): Returns true if this map contains a mapping for the specified key. More formally, returns true if and only if this map contains a mapping for a key k such that Objects.equals(key, k). (There can be at most one such mapping.)이 맵이 인자로 주어진 key를 갖고 있으면 true를 리턴합니다.
- 키값을 사실상 value로 넣고, 밸류를 index로 넣어 사용한 방법이다.
728x90
반응형
'TIL > Coding Test' 카테고리의 다른 글
[LeetCode] Majority Element (0) | 2021.03.20 |
---|---|
[LeetCode] Lemonade Change (4) | 2021.03.17 |
[LeetCode] Top K Frequent Elements (0) | 2021.03.15 |
[LeetCode] Roman to Integer (2) | 2021.03.13 |
[LeetCode] Path Sum (2) | 2021.03.11 |