백준 2480번
백준 2480번을 풀어보았다.
let input = require('fs').readFileSync('/dev/stdin').toString().split(' ')
const a = Number(input[0])
const b = Number(input[1])
const c = Number(input[2])
let reward
if (a === b) {
if (b === c) reward = 10000 + a * 1000
else reward = 1000 + a * 100
} else if (a === c || b === c) {
reward = 1000 + c * 100
} else {
reward = Math.max(a, b, c) * 100
}
console.log(reward)
같은 눈이 3개인 경우, 2개인 경우, 없는 경우를 빠트리지 않고 조건식으로 표현해내는 것이 관건이라고 생각하였다.
나는 a와 b의 관계, 이후로는 a, b와 c의 관계를 기준으로 분기를 나누었다.
먼저 if (a === b) {} else {}로 a와 b가 같은 경우와 아닌 경우로 나누었고,
각각의 분기 안에서는 if (b === c) {} else {}, if (a === c || b === c) {} else {}로 a 또는 b와 c가 같은 경우와 아닌 경우로 나누었다.
정답은 맞췄지만 내 코드가 최선의 코드는 아니라는 생각이 들어 다른 풀이들을 더 찾아보았다.
let input = require('fs').readFileSync('/dev/stdin').toString().split(' ')
const a = Number(input[0])
const b = Number(input[1])
const c = Number(input[2])
let reward
if (a === b && b === c) reward = 10000 + a * 1000
else if (a === b || b === c) reward = 1000 + b * 100
else reward = Math.max(...input) * 100
console.log(reward)
각 분기는 순서대로 같은 눈이 3개인 경우, 2개인 경우, 없는 경우를 처리하고 있다.
첫번째 조건식인 a === b && b === c를 false로 만드는 경우는 다음의 3가지이다.
- a !== b, b === c
- a === b, b !== c
- a !== b, b !== c
이 중 a !== b, b === c와 a === b, b !== c는 같은 눈이 2개인 경우로 두번째 분기에서 처리되고
a !== b, b !== c는 같은 눈이 없는 경우로 세번째 분기에서 처리된다.
내 코드는 같은 눈이 2개인 경우를 두 개의 분기로 나누어 처리한 반면,
이 코드는 각 경우를 각각 하나의 분기로 한 번에 처리해 로직이 한눈에 파악될 수 있었다.
덧붙여 내 코드는 Math.max(a, b, c)와 같이 숫자를 직접 나열하여 전달한 반면,
이 코드는 전개연산자를 사용해 다양한 조건과 상황에 보다 더 유연하게 대응할 수 있도록 하였다.