https://www.acmicpc.net/problem/2484
주사위의 각 눈이 몇번 나왔는지를 저장할 배열이 필요하다. 인덱스 0은 사용하지 않을 것이라서 int dice[7] = {0};로 배열을 만들고 초기화해준다. 이후 주사위 입력을 받을 때는 입력받은 숫자가 num이라고 치면 dice[num]++; 로 배열에 해당 숫자의 카운트를 1 늘려준다.
문제에 제시되어 있는 (1) 같은 눈이 4개 나온 경우 / (2) 같은 눈이 3개 나온 경우 / (3) 같은 눈이 2개씩 2쌍이 나오는 경우 / (4) 같은 눈이 2개만 나오는 경우 / (5) 모두 다른 눈인 경우 로 케이스를 나누어 구현했다.
(1) 같은 눈이 4개 나온 경우, (2) 같은 눈이 3개 나온 경우는 그냥 일반적인 방법으로 구현하였다.
(3) 같은 눈이 2개씩 2쌍이 나오는 경우, (4) 같은 눈이 2개만 나오는 경우 - 여기가 가장 헷갈리는 부분이었는데...
일단 눈의 숫자를 저장해놓기 위해 vector<int> pairs 배열을 만들어준다.
for문을 돌면서 2개씩 나온 눈을 pairs 벡터에 모두 저장해둔 후,
pairs 벡터의 크기가 2라면, 즉 2쌍이라면 2쌍 식에 맞추어 계산해준다.
pairs 벡터의 크기가 1이고, 동시에 money == 0 인 경우(이미 상금이 정해진 경우 덮어쓰는걸 방지하기 위함)에는 1쌍 식에 맞추어 계산해준다.
(5) 모두 다른 눈인 경우 - 가장 큰 값을 찾기 위해 이때는 for문을 6에서 1까지 역순으로 돌려준다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int max_money = 0;
for (int i = 0; i < n; i++) {
// 주사위의 각 눈이 몇번 나왔는지 저장하는 배열
int dice[7] = {0};
for (int j = 0; j < 4; j++) {
int num;
cin >> num;
dice[num]++;
}
int money = 0;
// 4개가 같은 경우
for (int j = 1; j <= 6; j++) {
if (dice[j] == 4) money = 50000 + j * 5000;
}
// 3개가 같은 경우
for (int j = 1; j <= 6; j++) {
if (dice[j] == 3) money = 10000 + j * 1000;
}
// 2쌍
vector<int> pairs;
for (int j = 1; j <= 6; j++) {
if (dice[j] == 2) pairs.push_back(j);
}
if (pairs.size() == 2) money = 2000 + (pairs[0] + pairs[1]) * 500;
// 1쌍
if (pairs.size() == 1 && money == 0) money = 1000 + pairs[0] * 100;
// 모두 다를 때
if (money == 0) {
for (int j = 6; j >= 1; j--) {
if (dice[j] == 1) {
money = j * 100;
break;
}
}
}
// 최종 값 업데이트
max_money = max(max_money, money);
}
cout << max_money << endl;
return 0;
}