본문 바로가기
기타/알고리즘(백준)

[JS] 백준 2480 주사위 세개

by ㅇㅇ우너자나나 2022. 9. 21.

 

https://www.acmicpc.net/problem/2480

 

2480번: 주사위 세개

1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.  같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.  같은 눈이 2개

www.acmicpc.net

 

1. 코드

const [a, b, c] = require('fs').readFileSync('/dev/stdin').toString().split(' ').map(i=>+i);
let result;
if(a===b){
    if(b===c){
        // a=b=c
        result = 10000+a*1000;
    }
    else if(b!==c){
        // a=b
        result = 1000+a*100;
    }
} else if(a!==b){
    if(b===c){
        // b=c
        result = 1000+b*100;
    }
    else if(b!==c){
        if(c===a){
            // a=c
            result = 1000+a*100;
        }
        else if(c!==a){
            // 다 다름
            if(a>b){
                if(b>c){
                    result = a*100;
                }
                else if(b<c){
                    if(a>c){
                        result = a*100;
                    }
                    else if(a<c){
                        result = c*100;
                    }
                }
            }
            else if(a<b){
                // 다 다름
                if(b>c){
                    result = b*100;
                } else if(b<c){
                    result = c*100;
                }
            }
        }
    }
}
console.log(result);

 

 

 

 

 

 

2. 다른 코드

const [a, b, c] = require('fs').readFileSync('/dev/stdin').toString().split(' ').map(i=>+i);
if (a === b && b === c && a === c) { console.log(10000 + a * 1000) };
else if (a !== b || b !== c || c !== a) {
  if (a === b || a === c) { console.log(1000 + a * 100) };
  if (b === c) { console.log(1000 + b * 100) };
}
else if(a !== b && b !== c && c !== a){
  console.log([a,b,c].sort().reverse()[0]*100)
}
  • 모든 경우를 다 정의해줄 필요 없이, 논리연산자를 통해 코드를 줄일 수 있었다.
  • 배열.sort() 메서드를 통해 작은 숫자부터 큰 숫자로 배열 내부 숫자의 순서를 바꿀 수 있으며, reverse()를 통해 큰 숫자부터 작은 숫자로 배열 내부 숫자의 순서를 변경 가능했다.
  • 필요 없는 코드도 있어보인다. 첫번째 else if 문의 마지막인 c!==a 조건식의 참거짓을 따지려면 앞의 두 조건이 다 false여야하는데, 그러면 a===b, b===c 이므로 이미 두번째 줄의 조건식에 걸리지 않았을까 싶다.

 

const [a,b,c] = require('fs').readFileSync('/dev/stdin').toString().split(' ').map(i=>+i);

if (a === b && a === c){
    console.log(10000+a*1000);
}
else{
    if (a === b || a === c){
        console.log(1000 + a*100);
    }
    else if (b === c){
        console.log(1000 + b*100);
    }
    else{
        console.log(Math.max(a,b,c)*100);
    }
}
  • Math.max로 숫자들 중 가장 큰 숫자를 골라낼 수 있다.
  • !== 연산자를 사용하면 이해하기 어려웠지만, 이 코드에서는 === 를 사용해서 훨씬 직관적으로 잘 이해가 됐다.