프로그래머스 합성수 찾기 자바스크립트 | Map 객체, forEach

Chaeyeon Lee·2023년 5월 25일
0

🔅 1. 아이디어

자연수 n이하의 모든 정수를 검사한다.
각 정수의 약수가 몇 갠지 구한다.
예를 들어 1은 약수 1개, 2는 약수 2개, 3은 약수 2개, 4는 약수 3개, ... , n은 약수 cnt개
그 다음, 약수가 3개 이상일 때에만 ans변수를 증가시킨다.


🧑‍💻 2. 내 코드

function solution(n) {
    let temp=new Map();
    let answer=0;
    
    for(let num=1; num<=n; num++){
        let cnt=0;
        for(let i=1; i<=num; i++){
            if(num%i==0){
                cnt++;
            }
        }
        temp.set(num, cnt);
    }
    temp.forEach((value, key)=>{value>=3 ? answer+=1 : answer+=0 });
    return answer;
}

근데 쓰고 나니...짜피 이중for문 돌릴 거였으면 굳이 map, set 썼어야 되나 싶다. 그러나 새로운 개념이 왕창 나왔으므로 기록함.


🐣 3. 개념

📌 Map

Array.prototype.map()이랑 다르다. 난 계속 헷갈렸었지만.
Map 객체는 키-값 쌍과 키의 원래 삽입 순서를 기억한다. 모든 값이 키/값으로 사용될 수 있다.
Map에서의 키는 오직 단 하나만 존재한다.

const map1 = new Map();

map1.set('a', 1);
map1.set('b', 2);
map1.set('c', 3);
console.log(map1.get('a'));
// 1

map1.set('a', 97);
console.log(map1.get('a'));
// 97

console.log(map1.size);
// 3

map1.delete('b');
console.log(map1.size);
// 2

console.log(map1.has('a'));
//true
console.log(map1.has(1));
//false

객체랑 맵이랑 뭐가 다르냐? Object는 Map과 유사한데,
(1) 둘 다 값을 가리키는 키를 설정하고
(2) 해당 값을 받아올 수 있으며
(3) 키를 삭제할 수 있고
(4) 키에 뭐가 저장되어 있는지 여부를 알 수 있음

차이점은 여러가지가 있지만, 주로
(1) Map의 키는 모든 값이 될 수 있지만 Object의 키는 String 혹은 Symbol이어야 한다는 것.
(2) Map은 키/값에 따라 정렬될 수 있지만 Object는 항상 정렬되진 않는다는 것.
(3) Map은 순회가능하므로 직접 반복 가능하지만 Object는 Object.keys 혹은 Object.entries, for...in를 사용해야 한다는 것.

난 아마 쓴다면 Map만 쓸 것 같다.

Map() : 새로운 Map 객체를 생성함
Map.prototype.size() : Map 객체의 키/값 쌍의 개수를 반환함
Map.prototype.clear() : Map 객체의 모든 키/값 쌍을 제거함
Map.prototype.delete() : Map 객체의 특정 키를 삭제. 삭제되었을 경우 true 반환, 없으면 false 반환. 이후에 map.has(key)를 실행하면 false 반환
Map.prototype.get() : 주어진 키에 해당하는 값을 반환. 값이 없으면 undefined 반환
Map.prototype.has() : 주어진 키에 해당하는 키가 있으면 true, 없으면 false 반환
Map.prototype.set() : Map 객체에서 전달된 키의 값을 설정. Map 객체를 반환
Map.prototype.keys() : Map 객체에 삽입된 순서에 따라 각 요소의 키를 포함하는 새로운 반복자 반환. ===맵의 모든 key 반환
Map.prototype.values() : Map 객체에 삽입된 순서에 따라 각 요소의 값을 포함하는 새로운 반복자 반환. ===맵의 모든 value 반환
Map.prototype.entries() : Map 객체에 삽입된 순서에 따라 [key, value] 두 개의 멤버 배열을 포함하는 새로운 반복자 반환

📌 Map.prototype.forEach()

: Map 객체에 존재하는 각 키/값 쌍에 대해 순서대로 콜백함수 호출.

myMap.forEach((value, key) => {
  console.log(`${key} = ${value}`);
});
// 0 = zero
// 1 = one

이런 식으로, value와 key값을 순서대로 돌면서 콜백함수를 호출하는 것!

new Map([['foo', 3], ['bar', {}], ['baz', undefined]])
  .forEach(logMapElements);

// "m[foo] = 3"
// "m[bar] = [object Object]"
// "m[baz] = undefined"

다른 사람 풀이 중 가장 좋았던 풀이

function solution(n) {
    var answer = 0;
    for(let i = 4; i <= n; i++){
        for(let j = 2; j < i; j++){
            if(i % j === 0){
                answer += 1;
                break;
            }
        }
    }

    return answer;
}

다른 사람들 풀이 중 이게 제일 좋았다. 우선 약수를 2부터 설정해서 반복회수를 줄이고자 노력했다는 점이...
또한, 어차피 1, 2, 3은 약수 개수가 2개뿐이라 합성수에 포함 안 되니 버리고 시작했다.
앞으론 이렇게 풀어야지



출처
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Map

profile
프론트엔드 개발자 지망생

0개의 댓글