약 한 달 간, CodeKata를 한다고 한다. 매일 저녁 6시-7시까지 한 문제씩 두명이 함께 알고리즘 문제를 푸는 시간이다.
정해진 배열에서 두 수를 뽑아 그 수의 합을 통해서 그 수가 배열의 몇번째에 위치하는지 찾는 문제다. 가장 먼저 떠올린 개념은 이중for문이였다. 이중 for문으로 반복문을 돌린 후, if문으로 정답을 찾아가는 로직을 생각했다.
( 아래 그림처럼 맞을 때까지 반복해야하니 이중for문을 써야겠다고 생각했다. )
const twoSum = (nums, target) => {
// 아래 코드를 작성해주세요.
for(let i = 0; i < nums.length; i++){
for(let j = i+1; j < nums.length; j++){
if((nums[i]+nums[j]) === target){
return [i,j];
}
}
}
}
좀 간단하게 로직을 짜서 틀리면 어떡하나.. 라는 생각이 조금은 들었다. 다행스럽게도 통과했다. 생각보다 빠르게 해결되서 다른 풀이로 문제를 접근했다. 바로 reduce()메소드를 활용해서 좀 다른 방향으로 문제를 풀어나갔다.
function solution(nums, target){
let sum = nums.reduce((a,b)=>{return a+b}) //reduce 메소드 활용
let result = (sum - target);
for(let i = 0; i < nums.length; i++){
for(let j = i+1; j < nums.length; j++){
if(nums[i]+nums[j] === result){
return [i,j];
}
}
}
}
이렇게 풀면 특정수가 나오는 index를 제외한 배열이 출력된다.
배열.reduce( (누적값, 현재값, 인덱스, 요소) => { return 결과 }, 초기값 );
기본적으로 reduce 메서드도 다른 메서드와 동일하게 첫 번째 인자로 함수를 받는다. 하지만, 두 번째 인자로 초기값을 셋팅할 수 있다는 것에서 차이가 있다. 물론, 두 번째 인자는 생략이 가능하며, 생략 시에는 배열의 첫 번째 값이 그값을 담당한다.
< 매개변수 >
arr.reduce ( callback [, initialValue ] )
callback : 배열의 각 요소에 대해 실행할 함수. 다음 네 가지 인수를 받음.
- 누적값 : 누산기accmulator는 콜백의 반환값을 누적함. 콜백의 이전 반환값 또는, 콜백의 첫 번째 호출이면서 initialValue를 제공한 경우에는initialValue의 값.
- 현재값 : 처리할 현재 요소.
- 인덱스 (optional : 사용해도 되고 안해도 되고) : 처리할 현재 요소의 인덱스. initialValue를 제공한 경우 0,
아니면 1부터 시작.
- array(optional : 사용해도 되고 안해도 되고) : reduce()를 호출한 배열.
initialValue(optional : 사용해도 되고 안해도 되고) : callback의 최초 호출에서 첫 번째 인수에 제공하는 값.
초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용. 빈 배열에서 초기값 없이 reduce()를 호출하면 오류가 발생.
const arr = [1, 2, 3, 4, 5];
const result = arr.reduce((acc, cur, idx) => { return acc += cur }, 0);
console.log(result); // 15
const arr2 = [1, 2, 3, 4, 5];
const result2 = arr2.reduce((acc, cur, idx) => { return acc += cur }, 10);
console.log(result2); // 25
'알고리즘' 카테고리의 다른 글
[CodeKata] Week 1 - Day 2 ( JavaScript ) (0) | 2022.02.15 |
---|---|
[Programmars] K 번째 수 (JavaScript) (0) | 2022.02.15 |
[Programmars] 완주하지 못한 선수 (JavaScript) (0) | 2022.02.11 |
[Programmars] 문자열 내림차순으로 배치하기 (JavaScript) (0) | 2022.02.10 |
[Programmars] 제일 작은 수 제거하기 (JavaScript) (0) | 2022.02.10 |
댓글