JS알고리즘_주사위게임 3 ++9/12수정

돌리의 하루·2023년 9월 11일
0

🐌문제 설명

  • 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 함수를 작성해 주세요.

👩 문제를 보고 생각한 것

문제가 나름 (?) 친절하게 설명해주는구나.
네 주사위를 굴렸을 때의 경우의 수를 나누고 그에 대한 return 값을 주면 되겠다!

  • solution(a,b,c,d)의 매개변수를 배열로 만들자.
  • 배열의 원소들이 모두 같을 때의 변수를 만들고 처음 조건으로 만들면 되겠다.
  • 원소가 3개가 같고 나머지 하나가 다른 경우는 어떻게 할까..
    (1) 배열의 원소를 각자 비교, 같은 원소가 몇 개인지 알 수 있는 함수를 만든다.
    (2) arr.some 을 이용해 (1)번의 함수의 조건이 3을 만족하는 조건을 추가한다. 이 때 for구문을 추가하여 같은 숫자인 3개가 아닌 숫자를 빼내서 문제대로 return 값을 만든다
    (3) 3번째 조건 역시 arr.some을 이용한 (1)번의 함수 조건이 2를 만족하는 조건을 추가하고, 두 개의 숫자가 같을 때는 나머지 두 개의 숫자가 [1]같을 경우 [2]같지 않을 경우로 나눠야 하기 때문에 조건을 추가해준다.
    return값으로 나오는 절댓값은 Math.abs(a,b)로 처리한다.
    (4) 모든 숫자가 같지 않을때는 (1)함수의 길이가 0으로 처리한다.

위와 같은 조건으로 아래와 같이 작성했다😳

function solution(a, b, c, d) {

let arr = [a,b,c,d]
let arrAll = arr.every((el)=> el === arr[0])

const Investigate = (val) => {
    return arr.filter(el=> el ===val).length
}

if(arrAll) return 1111 * arr[0]
else if(arr.some(el => Investigate(el) === 3)){
        for(let i=0; i<arr.length; i++){
   if(Investigate(arr[i])===3){
       const anotherNumber = arr.find((el)=> el !== arr[i])
 return (10 * arr[i] + anotherNumber) ** 2;
   }
}       
}else if(arr.some(el => Investigate(el) === 2)){
    const p = arr.find((el)=> Investigate(el)===2)
    const [q,r] = arr.filter(el => el!==p)
    if(q !==r){
        return q *r;
    }else{
          return (p + q) * Math.abs(p - q);
    }
}else if(Investigate(arr) === 0){
let small = 0
    for(let i =0; i <arr.length; i++){
        if(arr[i] < arr[i+1])return small +=arr[i]
    }
return small;
}
}

적고 코드를 보고나니 너무 복잡하게 처리한듯 싶기도 하다..간단하게 풀 수 있는 다른 방법도 더 생각해봐야겠다...! 😲

++수정
풀고 나서 확인해봤더니 몇 개의 예시에서 오류가 난 부분을 확인했다!

내 코드의 문제점은, 두 개의 요소가 같을때 변수를 굳이 p,q,r로 복잡하게 설정할 필요가 없었다.

그리고 q,r를 똑같이 설정해서 오류가 나고 있었다.

이 부분을 바꾸려면, p로 설정한 변수를 없애고, 배열구조할당으로 다시 코드를 변경해야 했다.

그리고 요소가 3개가 같을 때와 2개가 같을 때 모두 for구문으로 돌리고 있어서, 이 안에 조건을 추가하고 else if구문을 없앴다.

위의 조건이 모두 아닐 때 Math.min으로 제일 작은 수를 처리했다.

function solution(a, b, c, d) {

let arr = [a,b,c,d]
let arrAll = arr.every((el)=> el === arr[0])

const Investigate = (val) => {
    return arr.filter(el=> el ===val).length
}

if(arrAll) return 1111 * arr[0]
for (let i = 0; i < arr.length; i++) {
        if (Investigate(arr[i]) === 3) {
            const anotherNumber = arr.find(el => el !== arr[i]);
            return (10 * arr[i] + anotherNumber) ** 2;
        }
    }
for( let i =0; i< arr.length; i++) {
    if(Investigate(arr[i]) === 2){
        const [p,q] = arr.filter(el => el !== arr[i])

        if(p !== q){
            return p * q;
        }else {
            return (arr[i] + p) * Math.abs(arr[i] - q)
        }
    }
}
return Math.min(...arr)
}
profile
진화중인 돌리입니다 :>

0개의 댓글