Algorithm/Baekjoon

백준 2480번

minhi 2024. 10. 2. 21:39

백준 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)와 같이 숫자를 직접 나열하여 전달한 반면,

 

이 코드는 전개연산자를 사용해 다양한 조건과 상황에 보다 더 유연하게 대응할 수 있도록 하였다.