캐또's coding

2480 - 주사위 세개 - node.js 본문

기초 공부/백준 문제 풀이

2480 - 주사위 세개 - node.js

JS_K_coding 2022. 8. 14. 11:04

문제

1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다. 

  1. 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다. 
  2. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다. 
  3. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.  

예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

입력

첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다. 

출력

첫째 줄에 게임의 상금을 출력 한다.

예제 입력 1 복사

3 3 6

예제 출력 1 복사

1300

예제 입력 2 복사

2 2 2

예제 출력 2 복사

12000

예제 입력 3 복사

6 2 5

예제 출력 3 복사

600

출처

Olympiad > 한국정보올림피아드 > 한국정보올림피아드시․도지역본선 > 지역본선 2010 > 중등부 1번

  • 잘못된 데이터를 찾은 사람: sait2000
  • 데이터를 추가한 사람: tkdring3

알고리즘 분류


입력 받은 값 세 개에 대해서 조건에 따라 총액 = 결과를 출력하면 되는 문제. 각 수를 A, B, C라고 보고 생각했다.

1. 만약 A, B, C가 모두 같은 숫자라면? => 10000 + A*1000

2. 그렇지 않고(else if) 두 개가 같은 경우

2-1. A, B가 같다면? => 1000 + A * 100

2-2. A, C가 같다면? => 1000 + A * 100

2-3. B, C가 같다면? => 1000 + B * 100

3. A, B, C가 모두 같지 않다면? => A, B, C 중 가장 큰 수 * 100

const input = require('fs').readFileSync('/dev/stdin').toString().split(' ').map(Number);
const [A, B, C] = input;

if (A == B && B == C) {
  console.log(10000 + A * 1000);
} else if (A == B) {
  console.log(1000 + A * 100);
} else if (A == C) {
  console.log(1000 + A * 100);
} else if (B == C) {
  console.log(1000 + B * 100);
} else if (A != B && B != C) {
  console.log([A, B, C].sort().pop() * 100);
}

마지막에 모든 수가 다를 경우 가장 큰 수를 가져와야 하므로, sort().pop()을 이용했다. sort는 오름차순 정렬, pop은 가장 마지막 요소를 가져오는 것이므로 예를 들어 숫자가 3, 1, 6으로 입력될 경우 1, 3, 6으로 정렬한 뒤 가장 마지막 숫자인 6을 뱉어준다. 그렇게 문제 해결.

 

단순히 모든 경우의 수를 생각한다면 위와 같다. 그러나 만약에?? 문제에 따라서 주사위가 4개라고 했을 경우는? 혹은 주사위가 5개라고 되었을 경우는? 조건이 점점 많아질 것인데 모든 조건에 따라서 문제를 작성해야 하는 것인가?

문제의 마지막에 썼던 것처럼 정렬을 이용하면 문제 해결이 쉬워진다는 검색 결과가 있었다. 마지막에만 정렬을 하는 것이 아니라 애초에 문자를 받아올 때 숫자를 정렬해서 받아오는 것이다.

const input = require('fs').readFileSync('/dev/stdin').toString().split(' ').sort().map(Number)
const [A, B, C] = input;

if (A == B && B == C) {
  console.log(10000 + A * 1000);
} else if (A == B || B == C) {
  console.log(1000 + B * 100);
} else {
  console.log(C * 100);
}

정렬된 수를 대상으로 하기 때문에 세 숫자가 모두 같은 경우아 아니라면 A와 B가 같거나 B와 C가 같거나 A, B, C 모두 다른 세 경우의 수만 남게 된다. 또한 이미 정렬이 되어 있어 C가 가장 큰 수가 되기 때문에 모두 다른 경우의 수도 처리하기 편해진다. 주사위가 4개가 되더라도 조건을 엄청 많이 추가할 필요도 없다.

'기초 공부 > 백준 문제 풀이' 카테고리의 다른 글

10950 - A+B - 3 - node.js  (0) 2022.08.14
2739 - 구구단 - node.js  (0) 2022.08.14
2525 - 오븐 시계 - node.js  (0) 2022.08.13
2884 - 알람 시계 - node.js  (0) 2022.08.13
14681 - 사분면 고르기 - node.js (20번째)  (0) 2022.08.13
Comments