nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열
예를 들어,
nums은 [4, 9, 11, 14]
target은 13
nums[0] + nums[1] = 4 + 9 = 13 이죠?
그러면 [0, 1]이 return 되어야 합니다.
문제해석
nums 배열의 요소 중에서 더해서 target이 나오는 nums의 인덱스 값들을
반환하라.
한쌍 밖에 존재하지 않음!
먼저 내가 해본것
const twoSum = (nums, target) => {
index = [];
//
for (let i = 0; i < nums.length; i++) {
if(nums[i] + nums[i+1] === target) {
index.push(i,i+1);
}
}
return index;
let result = [];
for(let i = 0; i < nums.length-1; i++) {
for(let j = i; j < nums.length; j++) {
if(nums[i] + num[j] === target) {
result.push(i, j);
return result;
}
}
}
}
twoSum([4,13,11,9], 13);
이러면 값이 나오긴하는데 그 값들이 반드시 인접해 있어야만 성립하기 때문에 twoSum([4,11,13,9], 13) 같이 4와 9가 서로 떨어져있으면 빈배열이 반환되기 때문에 실패
옆자리 현지님의 풀이를 보자.
현지님은 2가지 방법으로 푸셨다.
먼저 1번!
// 현지님 풀이1
let result = [];
for(let i = 0; i < nums.length-1; i++) {
for(let j = i; j < nums.length; j++) {
if(nums[i] + num[j] === target) {
result.push(i, j);
return result;
}
}
}
구구단 하듯이 배열의 요소들을 이중반복문으로 돌면서 조건에 맞는 값들을 빈배열에 push 하심
이중반복문은 근데 좀 안좋은 방법이라 좀 더 나은 방법이 없을까 고민하던 차에 2번탄생
// 현지님 풀이2
let myobj = {};
for(let i = 0; i < nums.length; i++) {
const diff = target - nums[i];
myobj[diff] = i;
}
for(let i = 0; i < nums.length; i++) {
if(myobj[nums[i]]) {
result.push(i, myobj[nums[i]]);
return result;
}
}
먼저 빈 객체를 만듬.
그리고 nums에 반복문을 돈다.
target인 13과 nums의 각 요소들의 차를 diff에 저장.
diff를 키로 인덱스를 벨류로 해서 빈 객체를 채운다.
그러면 객체가 새로 탄생하게 되는데 다음과 같다.
nums = [4, 13, 9, 11] 이라고 가정했을시, 값이 채워진 객체는
myobj = {
9: 0,
0: 1,
4: 2,
2: 3
}
이렇게 객체를 만들었으면 또 다시 nums로 반복문을 돈다.
if(myobj[nums[i]]) 이것은 nums 배열의 인덱스(i)로 찾은 요소의 값을 다시 myobj의 키로 사용해서 벨류값이 참인지 거짓인지 판별하는 것이다. (값이 없거나 0이면 false, 어떠한 값이라도 있으면 true)
그래서 반복문을 돌면 i = 0, numbs[0] = 4, myobj[4] = 2 이므로 값이 true가 되고, 그 numbs 배열의 인덱스와 객체에서 찾은 벨류의 값을 최종적으로 선택하여 빈 배열에 푸쉬해준다.
느낀점
배열과 객체를 자유자재로 넘나들고 반복문에 조금 더 친숙해져야겠다.
배열의 요소가 객체의 키가 되어서 벨류값을 찾고 그런 것들에 좀 더 익숙해져야할듯.