본문 바로가기
알고리즘/Programmers

[TIL] 2023.07.27 Programmers_주사위 게임 2

by heereal 2023. 7. 27.

주사위 게임 2

문제 설명

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

  • 세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
  • 세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
  • 세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.

세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

 

 

입출력 예

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

입출력 예 #1

  • 예제 1번에서 세 주사위 숫자가 모두 다르므로 2 + 6 + 1 = 9점을 얻습니다. 따라서 9를 return 합니다.

입출력 예 #2

  • 예제 2번에서 두 주사위 숫자만 같으므로 (5 + 3 + 3) × (52 + 32 + 32 ) = 11 × 43 = 473점을 얻습니다. 따라서 473을 return 합니다.

입출력 예 #3

  • 예제 3번에서 세 주사위 숫자가 모두 같으므로 (4 + 4 + 4) × (42 + 42 + 42 ) × (43 + 43 + 43 ) = 12 × 48 × 192 = 110,592점을 얻습니다. 따라서 110592를 return 합니다.

 


나의 풀이

function solution(a, b, c) {
    if ( a === b && b ===  c && a === c) {
        return (a + b + c) * (a**2 + b**2 + c**2) * (a**3 + b**3 + c**3)
    }
    else if ( a !== b && b !==  c && a !== c) {
        return a + b + c
    }
    else return (a + b + c) * (a**2 + b**2 + c**2);
}

if문으로 세 가지 경우에 따라 return 값을 달리했다. 이런 정석적인 풀이 말고 재밌는 풀이가 많을 거 같아서 다른 사람들의 풀이를 참고해 봤다.

 

 

다른 사람의 풀이 01

const solution = (a, b, c) => {
    const set = new Set([a, b, c]);
    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;
};

Set 객체를 사용해서 중복된 값을 걸러낸 배열의 length를 이용해서 switch문으로 경우에 따라 return값을 달리 한다. 그리고 return값을 계산할 때도 for문을 이용해서 계산을 반복적으로 처리한다.

 

 

다른 사람의 풀이 02

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)
        )
    }
}

1번 풀이와 비슷한 접근인데 spread operator를 이용해서 배열의 length로 접근하는 대신 `set.size`를 이용해서 중복된 값을 제거한 배열의 길이를 출력했다.

 


JavaScript Set

//let set = new Set(["사과","토마토","키위","키위"]); // set 객체 생성
let set = new Set(); // set 객체 생성
set.add("사과");
set.add("토마토");
set.add("키위");
set.add("키위"); //	키위가 존재하기 때문에 저장되지 않음

console.log(set.size); // 3 
console.log(set.has("사과")); // true

set.delete("키위");
console.log(set.size); // 2

set.clear();
console.log(set.size); // 0
  • Set 객체는 자료형에 상관없이 데이터를 저장한다 하지만 중복 값은 허용하지 않습니다
  • new Set() – Set 객체를 생성합니다. 또는 배열을 초기에 넣을 수 있습니다. 
  • set.add(value) – Set 객체에 value가  없다면 값을 저장합니다. 
  • set.delete(value) – Set 객체에 value값을 삭제합니다. 
  • set.has(value) – Set 객체에 value가 있으면 true, 없으면 false 리턴
  • set.clear() – Set 객체에 들어있는 데이터를 삭제합니다.
  • set.size – Set 객체에 들어있는 데이터의 개수를 리턴합니다. 

 

출처

https://jang2r.tistory.com/54

https://www.daleseo.com/js-set/

 

 

댓글