작성일 :

문제 링크

2484번 - 주사위 네 개

설명

네 개의 주사위를 굴렸을 때 나온 눈의 조합에 따라 상금을 계산하고, 가장 큰 상금을 출력하는 조건 분기 문제입니다.

  • 입력으로 테스트케이스 개수 n이 주어지고, 각 줄마다 네 개의 정수가 주어집니다.
  • 각 정수는 주사위 눈(1 ~ 6)을 의미합니다.
  • 네 개의 눈에 따라 다음과 같은 방식으로 상금을 계산합니다:
    • 같은 눈이 4개 → 50000 + (같은 눈) × 5000
    • 같은 눈이 3개 → 10000 + (같은 눈) × 1000
    • 같은 눈이 2쌍 → 2000 + (작은 눈) × 500 + (큰 눈) × 500
    • 같은 눈이 2개 → 1000 + (같은 눈) × 100
    • 모두 다른 눈 → 가장 큰 눈 × 100
  • 모든 테스트케이스 중 가장 큰 상금을 출력합니다.

접근법

  1. 테스트케이스 수를 입력받습니다.
  2. 각 줄마다 네 개의 주사위 값을 입력받고, 1 ~ 6까지 등장 횟수를 저장합니다.
  3. 등장 횟수를 기반으로 다음 조건을 순차적으로 확인하며 최대 상금을 계산합니다:
    • 4개 동일
    • 3개 동일
    • 2개씩 2쌍
    • 2개 동일
    • 모두 다름
  4. 조건을 만족할 때마다 가능한 상금을 계산하고, 최댓값을 저장합니다.
  5. 모든 케이스 후 최대 상금을 출력합니다.

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;
}