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 값을 주면 되겠다!
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)
}