알고리즘

[알고리즘] 프로그래머스LV.0 -주사위게임3 (JS)

로돌씨 2024. 6. 6. 15:31

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

 

프로그래머스

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

programmers.co.kr

 

문제

 

풀이

function solution(a, b, c, d) {
    const nums = [a, b, c, d];
    const appear = {}
    
    //객체에 각 요소가 몇번이나 들어가있는지 함수를 짬
    for(let i =0;i<4;i++){
        const num = nums[i];
        appear[num] = (appear[num] || 0) + 1;
    }

    //객체 중 밸류가 가장 높은수를 count로 지정
    const count = Math.max(...Object.values(appear));
    //밸류의 값에 따라 정렬
    const entries = Object.entries(appear).sort((a,b)=>a[1] - b[1])

    let answer = 0;
    switch(count){
        case 4:
            answer = 1111 * a;
            break;
        case 3:
            answer = (10 * Number(entries[1][0]) + Number(entries[0][0])) ** 2
            break;
        case 2:
            //둘다 두개의 페어가 맞춰진 경우 (ex : 1,1 / 2,2 일경우 length = 2 )
            if(entries.length === 2){
                answer = (Number(entries[1][0]) + Number(entries[0][0])) * Math.abs(Number(entries[1][0]) - Number(entries[0][0]))
            }
            //2개만 서로 갖고 나머지는 다 다른 경우
            if(entries.length === 3){
                //밸류가 1인것만 찾아 newEntries로 할당
                const newEntries = entries.filter((el)=> el[1]===1)
                answer = Number(newEntries[1][0]) * Number(newEntries[0][0])
            }
            break;
            //밸류가 1씩이라면 다 다른수이므로 제일 작은 수 반환
        case 1:
            answer = Math.min(...nums);
            break;
    }   
    return answer;
}

 

이런식의 문제를 저번에 한번 풀었었던것같은데 객체는 여전히 헷갈린다...

우선 배열의 어떤요소가 몇개 들어있는지를 객체에 저장해준다.

 

그렇게하면 객체엔 { '2' : 4 ... }형식으로 저장 될 것이다 .

이 객체를 Object.entries(객체) 를 사용하면 객체를 배열로 [ '2' , 4 ]형식으로 전환되어 나타날것이다.

그렇게해서 switch문을 이용해 밸류가 4라면 4개가 모두 경우 일때의 값을 반환 , 3개라면 3개일 경우의 값을 반환하고

2개일경우에는 두가지의 경우가있는데 만약 2개가 두쌍으로 같이 떨어진다면 entries의 길이는 2일것이다. (요소가 두개이기때문)

요소의 길이가 3이라면 두개가 맞아떨어지는값과 그 나머지의 값이 서로다르다는 뜻이므로 따로 처리를 해준다.