Programmers

[프로그래머스][JS] 주사위 게임 3

winter17 2023. 7. 7. 11:38

https://school.programmers.co.kr/learn/courses/30/lessons/181916

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 과정

function solution(a, b, c, d) {
    var answer = 0;
    const dice = [a, b, c, d]
    let obj = {} // 객체 생성
    for (let i = 0; i < dice.length; i++){
        if (obj[dice[i]]){
            obj[dice[i]]++
        }else{
            obj[dice[i]] = 1
        }
    }
    const arr = Object.keys(obj) // key값만 추출
    const keys = arr.map(item => parseInt(item)) // key값을 정수로 바꾸기
    const values = Object.values(obj)
    if (values.length === 1){ // 전부 같은 경우
        answer = 1111 * keys[0]
        return answer
    }else if(values.length === 2){
        if (values[0] === 2){ // 두 개씩 같은 경우
            answer = (keys[0] + keys[1]) * Math.abs(keys[0] - keys[1])
            return answer
        }else{ // 세 개가 같은 경우
            if (values[1] === 3){
                answer = (10 * keys[1] + keys[0]) **2
                return answer
            }else{
                answer = (10 * keys[0] + keys[1]) **2
                return answer   
            }
        }
    }else if (values.length === 3){ // 두 개가 같고 나머지 두 개는 다른 경우
        answer = 1
        for (let i = 0; i < values.length; i++){
            if (values[i] === 1){
                answer *= keys[i]
            }
        }
        return answer
    }else{ // 모두 다른 경우
        answer = Math.min(...keys)
        return answer
    }
}

조건이 총 5개이다

1. 모두 같은 경우(p) → 1111 * p

2. 세 개가 같고(p), 하나가 다른 경우(q) → (10 * p + q) ** 2

3. 두 개 같고(p), 두 개 같고(q) → (p + q) * |p - q|

4. 두 개가 같고(p), 다른 하나(q), 또 다른 하나(r) → q * r

5. 모두 다른 경우 → 가장 작은 것 반환


리뷰

모든 경우의 수를 체크해줘야 하는데 풀면서도 이런 방법밖에 없나... 하면서 풀었다.