코드카타 #1
twoSum함수에 숫자배열과 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.nums: 숫자 배열 target: 두 수를 더해서 나올 수 있는 합계 return: 두 수의 index를 가진 숫자 배열
예를 들어,
nums은 [4, 9, 11, 14] target은 13
nums[0] + nums[1] = 4 + 9 = 13 이죠?
그러면 [0, 1]이 return 되어야 합니다.**가정** target으로 보내는 합계의 조합은 배열 전체 중에 2개 밖에 없다고 가정하겠습니다.
배열에서 두 수를 빼내 덧셈을 한 값이 타겟값과 같으면 두수의 배열 인덱스 값을 리턴해줘야 하므로, 덧셈을 할 두 수를 찾기 위해서 for문을 이용하고, 조건에 맞는 수를 찾아야 하니, for문 안에 if문을 넣어줘야겠다!
const twoSum = (nums, target) => {
// 아래 코드를 작성해주세요.
let arr = [];
for (let i = 0; i < nums.length; i++){
for(let i = i + 1; i < nums.length; i++){
if(nums[i] + nums[j] === target){
arr.push(i, i+1);
}
}
}
return arr;
};
module.exports = { twoSum };
처음에는 i와 i+1로 변수를 설정했지만, nums의 배열에 두 수가 붙어있지 않으면 리턴이 안되어서 실패했다!
그렇다면 아예 변수를 다르게 설정하여 비교하면 어떨까? 라는 마음에서 변수 i와 j를 선언하고 반복문을 돌려보았다.
const twoSum = (nums, target) => {
// 아래 코드를 작성해주세요.
let arr = [];
for (let i = 0; i < nums.length; i++){
for(let j = i + 1; i < nums.length; j++){
if(nums[i] + nums[j] === target){
arr.push(i, j);
}
}
}
return arr;
};
module.exports = { twoSum };
결과는 성공, let j
에서 i+1
이 아닌 1로 줘도 무방한 것 같다.
const twoSum = (nums, target) => {
// 아래 코드를 작성해주세요.
let arr = [];
const subArr = nums.map(num => target - num);
const intersection = nums.filter(num => subArr.includes(num))
intersection.forEach(num => arr.push(nums.indexOf(num)))
return arr;
};
빛열음님의 코드...! 정말 빛과 같아서 충격;; for문이 비효율적이어서 어떤 방법이 있을지 고민했는데 이런 방법이 있다니 매우 충격이당.
아직 map메서드와 친하지 않은데 이번 기회에 공부를 다시 해야겠다고 생각했다.