본문 바로가기

프로그래머스

[알고리즘] 주사위게임3

주사위게임 3

다음과 같은 조건에 따라 적절한 값을 리턴.

 

-네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.

- 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.

- 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.

- 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.

- 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.

 

a b c d result
2 2 2 2 2222
4 1 4 4 1681
6 3 3 6 27
2 5 2 6 30
6 4 2 5 2

 

나의 풀이: 

function solution(a, b, c, d) {
    var dice = [a, b, c, d].sort((a,b)=> a-b)
    var [a,b,c,d] = dice
    const filtered = [...new Set(dice)] // 중복값 제거
    if(filtered.length === 1) { // 네 값이 같음
        return 1111 * a
    }else if(filtered.length == 4) { // 네 값이 다름
        return a
    }else if(filtered.length === 2 && b!==c ) { // 두 값씩 같음
        return (b+c)*Math.abs(b-c)
    }else if(filtered.length === 2 && b==c) { // 세 값 같고 하나 다름 
        if(a!==b) {
            return (10*b+a)**2
        }else{
            return (10*c+d)**2
        }
    }else{ // 두 값이 같고 두 값은 서로 다름
        if(a==b) {
            return c*d
        }else if(b==c) {
            return a*d
        }else{
            return a*b
        }
    }
}

sort 메서드를 이용해서 정리된 값인 dice, Set 을 이용해서 중복값을 제거한 filtered 를 활용하여 문제를 풀었다. 객체로 풀수 있을 것 같아서 값을 객체로 바꾸는 것 까지 했지만, 그 이후가 도저히 생각이 나지 않음. 다른 풀이를 보니 객체로 푼 문제가 있었다.

 

다른 풀이:

function solution(a, b, c, d) {
    const nums = [a, b, c, d];
    const obj = {};
    for(let i = 0; i < 4; i++) {
        if(obj[nums[i]]) {
            obj[nums[i]] += 1;
        } else {
            obj[nums[i]] = 1;
        }
    }
    const arr = Object.entries(obj).sort((a, b) => b[1] - a[1]);

    // 첫번째 조건
    if(arr.length === 1) {
        return 1111 * +arr[0][0]
    }

    if(arr.length === 2) {
        // 두번째 조건
        if(arr[0][1] === 3) {
            return (10 * +arr[0][0] + +arr[1][0]) ** 2
        }
        // 세번째 조건
        return (+arr[0][0] + +arr[1][0]) * Math.abs(+arr[0][0] - +arr[1][0])
    }
    // 네번째 조건
    if(arr.length === 3) {
        return +arr[1][0] * +arr[2][0]
    }

    return +(arr.sort((a, b) => +a[0] - +b[0])[0][0]);
}

entries 메소드를 활용하여 값을 빈도 수가 큰 순서부터 정렬한 다음, 조건을 나열해 주는 방식으로 풀 수 있다.