문제 설명

1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.

네 주사위에서 나온 숫자가 모두 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로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

제한사항

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

입출력 예

abcdresult
22222222
41441681
633627
252630
64252

풀이

function solution(a, b, c, d) {
    const maxValue = Math.max(a,b,c,d); // 가장 큰 수
    const minValue = Math.min(a,b,c,d); // 가장 작은 수
    
    let maxCount = 0; // 가장 큰 수의 공통 개수
    let minCount = 0; // 가장 작은 수의 공통 개수
    
    const arr = [a,b,c,d]; // 주사위 값을 배열화
    
    arr.forEach((el)=>{
        // 각각의 요소가 가장 큰 수랑 같으면 maxCount++
        if(el === maxValue){
            maxCount++
        }
        // 각각의 요소가 가장 작은 수랑 같으면 minCount++
        else if(el === minValue){
            minCount++
        }
    })
    
    // 4개가 동일
    // maxCount나 minCount 둘중 하나 아무거나 4가 나오면 4개가 전부 동일한 값임
    if(maxCount === 4){
        return 1111 * maxValue;
    }
    
    // 3개가 동일
    // maxCount가 3이면 나머지 minValue가 나머지 다른 값이 됨
    if(maxCount === 3){
        return (10 * maxValue + minValue) * (10 * maxValue + minValue);
    }
    // minCount가 3이면 나머지 maxValue가 나머지 다른 값이 됨
    if(minCount === 3){
        return (10 * minValue + maxValue) * (10 * minValue + maxValue);
    }
    
    // 2개씩 한쌍의 같은 값
    // maxCount랑 minCount가 각각 전부 2가 나와야 2개씩 한쌍의 같은 값임을 알 수 있음
    if(maxCount === 2 && minCount === 2){
        return (maxValue + minValue) * Math.abs(maxValue - minValue); // Math.abs() <= 절댓값 구하는 메소드
    }
    
    // 2개
    // 같은 값 두개를 제외한 나머지 각각의 값을 곱해야 하는 문제기 때문에, 따로 선언한 변수를 사용할 필요가 없음
    if(a === b){
        return c * d;
    }
    if(a === c){
        return b * d;
    }
    if(a === d){
        return b * c;
    }
    if(b === c){
        return a * d;
    }
    if(b === d){
        return a * c;
    }
    if(c === d){
        return a * b;
    }
    
    // 나머지 경우인 전부 다른 값일 때, 가장 작은 값을 리턴
    return minValue;
}

느낀 점

진짜 뒤-지게 어려웠다.
여기저기 참고하면서, 참고한 부분을 어떻게든 이해하고 풀기 위해서 하나하나 주석을 달아놨다.
이해는 했지만, 처음에 이런생각을 어떻게 한거지? 란 생각과 나의 힘으로 풀지 못한것이 아주 맘에 안든다..

profile
개인 이력, 포폴 관리 및 기술 블로그 사이트 👉 https://aimzero-web.vercel.app/

0개의 댓글