[JavaScript] 주사위 게임2 _ 객체 Set

Yeojin·2024년 2월 21일

코딩테스트 연습 > 코딩 기초 트레이닝

✅ 문제 설명

1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.

세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × ( + + )점을 얻습니다.
세 숫자가 모두 같다면 (a + b + c) × ( + + ) × ( + + )점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.


✅ 제한사항

  • a, b, c는 1이상 6이하의 정수입니다.

✅ 입출력 예

a b c result
2 6 1 9
5 3 3 473
4 4 4 110592

✅ 풀이

거듭제곱의 경우 연산자 ** (왼쪽의 숫자를 오른쪽 숫자만큼 제곱)를 사용할 수도 있고, Math.pow()를 사용할 수도 있다.


// 나의 풀이
const solution = (a, b, c) => {
    let result1 = a + b + c;
    let result2 = result1 * (Math.pow(a, 2) + Math.pow(b, 2) + Math.pow(c, 2));
    let result3 = result2 * (Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3));
    
    if(a!=b && a!=c && b!=c) {
        return result1;
    } else if(a==b && a==c && b==c) {
        return result3;
    } else {
        return result2;
    }
}


// 나의 풀이 개선
const solution = (a, b, c) => {
    let result1 = a + b + c;
    let result2 = a*a + b*b + c*c;
    let result3 = a ** 3 + b ** 3 + c ** 3;
    
    if(a != b && b != c && a != c) {
        return result1;
    } else if(a == b && b == c) {
        return result1 * result2 * result3;
    } else {
        return result1 * result2;
    }
}

Set 객체를 사용하여 중복되는 숫자를 없애고, Set의 길이를 통해 같은 숫자가 몇 개인지 확인하는 방식


// 다른 사람의 풀이 참고1
const solution = (a, b, c) => {
    const set = new Set([a, b, c]);
    // set.size 도 가능
    switch ([...set].length) {
        case 1: return calculate([a, b, c], 3);
        case 2: return calculate([a, b, c], 2);
        case 3: return calculate([a, b, c]);
    }
};

const calculate = (inc, n=1) => {
    const [a, b, c] = inc;
    let result = 1;
    for (let i = 1; i <= n; i++) {
        result *= Math.pow(a, i) + Math.pow(b, i) + Math.pow(c, i)
    }

    return result;
};

// 다른 사람의 풀이 참고2
function solution(a, b, c) {
    let sum1 = a + b + c;
    let sum2 = a * a + b * b + c * c;
    let sum3 = a ** 3 + b**3 + c**3;

    if (a === b && b === c) 
        return sum1*sum2*sum3;
     else if (a === b || a === c || b === c) 
        return sum1*sum2;
     else 
        return sum1;
}

// 다른 사람의 풀이 참고3
function solution(a, b, c) {
    const dsttCnt = new Set([a, b, c]).size

    switch(dsttCnt) {
        case 3: return a + b + c
        case 2: return (
            (a + b + c) * (a ** 2 + b ** 2 + c ** 2)
        )
        case 1: return (
            (a + b + c)
            * (a ** 2 + b ** 2 + c ** 2)
            * (a ** 3 + b ** 3 + c ** 3)
        )
    }
}

✅ Set 객체

Set은 중복을 허용하지 않는 값을 모아놓은 특별한 컬렉션이다. Set 내에 동일한 값이 있다면 set.add(value) 를 아무리 많이 호출하더라도 아무런 반응이 없을 것이다. Set 내의 값에 중복이 없는 이유가 바로 이 때문.

  • new Set(iterable)Set을 만듭니다. 이터러블 객체를 전달받으면(대개 배열을 전달받음) 그 안의 값을 복사해 Set에 넣어줍니다.
  • set.add(value) – 값을 추가하고 Set 자신을 반환합니다.
  • set.delete(value) – 값을 제거합니다. 호출 시점에 Set 내에 값이 있어서 제거에 성공하면 true, 아니면 false를 반환합니다.
  • set.has(value)Set 내에 값이 존재하면 true, 아니면 false를 반환합니다.
  • set.clear()Set을 비웁니다.
  • set.sizeSet에 몇 개의 값이 있는지 세줍니다.


let set = new Set();

let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

// 어떤 고객(john, mary)은 여러 번 방문할 수 있습니다.
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);

// 셋에는 유일무이한 값만 저장됩니다.
alert( set.size ); // 3

for (let user of set) {
  alert(user.name); // // John, Pete, Mary 순으로 출력됩니다.
}


let set = new Set(["oranges", "apples", "bananas"]);


profile
"Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better."

0개의 댓글