Today I Learned 2023.02.16. [기초문제 2일차]

Dongchan Alex Kim·2023년 2월 16일
0

Today I Learned

목록 보기
22/31
post-thumbnail

reduce함수와 누산기 개념

  • 일반적으로 reduce함수는 배열의 각 요소에 대해 reducer함수를 실행하고, 하나의 결과값을 반환한다.
  • map이 배열의 각 요소를 변형한다면 reduce는 배열 자체를 변형 → reduce라는 이름은 이 메서드가 보통 배열을 값 하나로 줄이는 쓰이기 때문
  • 배열 원소들의 전체 합을 구하거나 최대값을 구할 수 있습니다.

요소1. 누산기accumulator (acc)
누산기accmulator는 콜백의 반환값을 누적. 콜백의 이전 반환값 또는, 콜백의 첫 번째 호출이다.

요소2. 현재 값 (cur)
처리할 현재 요소

요소3. 현재 인덱스 (idx)
써도되고 안해도되고..

요소4. 원본 배열 (src)
써도되고 안해도되고..

let total = [1, 2, 3, 4, 5].reduce(
  ( acc, curr ) => acc + curr, 
  0
);
console.log(total) //15
let total = [{quntity: 1}, {quntity: 2}, {quntity: 1}].reduce(
    (acc, cur) => acc + cur.quntity
    , 0
)
console.log(total) // 결과값: 4

Map과 Set

  • 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환
  • key-value의 쌍을 저장하며 각 쌍의 삽입 순서도 기억하는 컬렉션
  • 맵은 객체와 달리 키를 문자형으로 변환하지 않으며, 키에 자료형 제약이 없다.
`new Map()`
	맵을 만든다.
    
`map.set(key, value)`
	key를 이용해 value를 저장한다.
    
`map.get(key)`
	`key`에 해당하는 값을 반환한다.
	key가 존재하지 않으면 undefined를 반환
        
`map.has(key)`
	key가 존재하면 true, 존재하지 않으면 false를 반환
    
`map.delete(key)`
	key에 해당하는 값을 삭제
    
`map.clear()`
	맵 안의 모든 요소를 제거
    
`map.size`
	요소의 개수를 반환
let visitsCountMap = new Map();
 
// john을 맵의 키로 사용
visitsCountMap.set(john, 123);
 
alert( visitsCountMap.get(john) ); // 123
  • map의 요소에 반복 작업하기
let recipeMap = new Map([
  ['cucumber', 500],
  ['tomatoes', 350],
  ['onion',    50]
]);
 
// 키(vegetable)를 대상으로 순회
for (let vegetable of recipeMap.keys()) {
  alert(vegetable); // cucumber, tomatoes, onion
}
 
// 값(amount)을 대상으로 순회
for (let amount of recipeMap.values()) {
  alert(amount); // 500, 350, 50
}
 
// [키, 값] 쌍을 대상으로 순회
for (let entry of recipeMap) { // recipeMap.entries()와 동일
  alert(entry); // cucumber,500 ...
}

코딩테스트 < 완주하지 못한 선수 >

function solution(pp,cpl){
    let key = new Map()
    for(let i = 0; i < cpl.length; i++){
        if(!key.has(cpl[i])){
            key.set(cpl[i],1)
        }else{
            key.set(cpl[i], key.get(cpl[i])+1)
        }
    }
    for(let i = 0; i < pp.length; i++){
        if(!key.has(pp[i])){
            return pp[i]
        }else{
            let count = key.get(pp[i])
            if(count == 0){
                return pp[i]
            }else{
                key.set(pp[i], count -1)
            }
        }
    }
}

코딩테스트 < 히샤드 수 >

//내가 쓴 코드
function solution(x) {
    let harshad = String(x).split('')
    let sum = harshad.reduce((acc,curr)=> acc + +curr,0)
    return x%sum == 0
}
//신기했던 코드
function solution(x) {
    return x%eval([...x.toString()].join("+")) ? false : true;
}
  • x % eval(...) == 0 ( 나머지가 0 )이라는 의미를 False로 가져가서 바로 삼항연산자로 이용가능하다.
//천재구나 했던 효율성 끝판왕코드
function solution(x) {
    let num = x;
    let sum = 0;
    do {
        sum += x%10;
        x = Math.floor(x/10);
    } while (x>0);

    return !(num%sum);
}

코딩테스트 < 두 개 뽑아서 더하기 >

  • 인덱스가지고 놀아보는 연습 필요하다.
    i 인덱스 range랑 j 인덱스 range를 잘 설정하면, 해당 값을 제외하고 더할 수 있는 방법이 보일 수 있다.
function solution(numbers) {
    let sums = []
    for(let i = 0; i < numbers.length-1; i++)
        for(let j = i+1; j < numbers.length;j++){
            let sum = numbers[i]+numbers[j]
            !sums.includes(sum) ? sums.push(sum) : null
        }
    return sums.sort((a,b)=> a-b)
  • 중복 값 제거에는 무조건 filter()함수만 쓰지 않아도 된다.
    - Set()값을 쓴 후, 스프레드 연산자를 이용해 다시 펼쳐주면 감쪽 같다!
const answer = [...new Set(temp)]
profile
Disciplined, Be systemic

0개의 댓글