[백준 2484] 주사위 네 개 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
네 개의 주사위를 굴렸을 때 나온 눈의 조합에 따라 상금을 계산하고, 가장 큰 상금을 출력하는 조건 분기 문제입니다.
- 입력으로 테스트케이스 개수
n
이 주어지고, 각 줄마다 네 개의 정수가 주어집니다. - 각 정수는 주사위 눈(1 ~ 6)을 의미합니다.
- 네 개의 눈에 따라 다음과 같은 방식으로 상금을 계산합니다:
- 같은 눈이 4개 →
50000 + (같은 눈) × 5000
- 같은 눈이 3개 →
10000 + (같은 눈) × 1000
- 같은 눈이 2쌍 →
2000 + (작은 눈) × 500 + (큰 눈) × 500
- 같은 눈이 2개 →
1000 + (같은 눈) × 100
- 모두 다른 눈 →
가장 큰 눈 × 100
- 같은 눈이 4개 →
- 모든 테스트케이스 중 가장 큰 상금을 출력합니다.
접근법
- 테스트케이스 수를 입력받습니다.
- 각 줄마다 네 개의 주사위 값을 입력받고, 1 ~ 6까지 등장 횟수를 저장합니다.
- 등장 횟수를 기반으로 다음 조건을 순차적으로 확인하며 최대 상금을 계산합니다:
- 4개 동일
- 3개 동일
- 2개씩 2쌍
- 2개 동일
- 모두 다름
- 조건을 만족할 때마다 가능한 상금을 계산하고, 최댓값을 저장합니다.
- 모든 케이스 후 최대 상금을 출력합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Linq;
class Program {
static void Main() {
int n = int.Parse(Console.ReadLine());
int maxPrize = Enumerable.Range(0, n).Select(_ => {
var cnt = Console.ReadLine().Split().GroupBy(int.Parse).ToDictionary(g => g.Key, g => g.Count());
return Enumerable.Range(1, 6).Select(i => {
int c = cnt.GetValueOrDefault(i);
return c switch {
4 => 50000 + i * 5000,
3 => 10000 + i * 1000,
2 => Math.Max(
Enumerable
.Range(i + 1, 6 - i)
.Where(j => cnt.GetValueOrDefault(j) == 2)
.Select(j => 2000 + i * 500 + j * 500)
.DefaultIfEmpty(0).Max(), 1000 + i * 100),
1 => i * 100,
_ => 0
};
}).Max();
}).Max();
Console.WriteLine(maxPrize);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin >> n;
int maxPrize = 0;
while (n--) {
int cnt[7] = {0, }, prize = 0;
for (int i = 0; i < 4; i++) {
int x; cin >> x;
cnt[x]++;
}
for (int i = 1; i < 7; i++) {
if (cnt[i] == 4) prize = max(prize, 50000 + i * 5000);
if (cnt[i] == 3) prize = max(prize, 10000 + i * 1000);
if (cnt[i] == 2) {
for (int j = i + 1; j < 7; j++)
if (cnt[j] == 2) prize = max(prize, 2000 + i * 500 + j * 500);
prize = max(prize, 1000 + i * 100);
}
if (cnt[i] == 1) prize = max(prize, i * 100);
}
maxPrize = max(maxPrize, prize);
}
cout << maxPrize << "\n";
return 0;
}