1. 서론
서로 유사한 문제 두 개다. 유사하다기 보단 세 개짜리 문제를 풀고 네 개짜리 문제를 푸는 게 문제 확장판 같은 느낌?
2. 문제 풀이
1) 주사위 세개
주사위를 세 번 던진다. 그리고 아래의 규칙을 통해 값을 계산한다.
- 같은 눈이 3개가 나오면 10,000원+(같은 눈)*1,000원의 상금을 받게 된다.
- 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)*100원의 상금을 받게 된다.
- 모두 다른 눈이 나오는 경우에는 (그중 가장 큰 눈)*100원의 상금을 받게 된다.
코드를 짜는 것 자체는 어떻게든 할 수 있는데 얼마나 간결하고 효율적으로 짜느냐 그게 포인트이다.
나는 주사위를 세 번 던진 값을 배열에 저장하고 정렬했다. 정렬한 이유는 그 중 가장 큰 눈을 판별하기 위해서 이다.
그리고 7개짜리 배열을 하나 더 만들었다. 거기에는 주사위 값이 몇 번 나오는지 저장해준다. (계수 정렬 느낌)
그리고 같은 눈이 세 개가 나올 때, 두 개가 나올 때 값을 처리해준다.
만약 위의 경우에 해당되지 않는다면 배열에서 가장 마지막 값(가장 큰 눈)을 가져와 상금을 계산해준다.
2) 주사위 네 개
주사위를 n번씩 4번 던진다. 그리고 아래의 규칙을 통해 값을 계산한다.
- 같은 눈이 4개가 나오면 50,000원+(같은 눈)*5,000원의 상금을 받게 된다.
- 같은 눈이 3개만 나오면 10,000원+(3개가 나온 눈)*1,000원의 상금을 받게 된다.
- 같은 눈이 2개씩 두 쌍이 나오는 경우에는 2,000원+(2개가 나온 눈)*500원+(또 다른 2개가 나온 눈)*500원의 상금을 받게 된다.
- 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)*100원의 상금을 받게 된다.
- 모두 다른 눈이 나오는 경우에는 (그중 가장 큰 눈)*100원의 상금을 받게 된다.
주사위 세 개의 확장판이다. n번 반복해서 계산한 값 중 가장 큰 값을 구하는 문제다.
나는 값을 배열에 입력받고 그 배열을 함수에 넣어서 상금을 계산해줬다.
함수에서는 주사위 세개 문제와 같이 7개짜리 배열을 만들어서 주사위의 값이 몇 개가 나오는지 세어 계산했다.
숫자가 큰 순으로 계산하고 4, 3을 이미 거쳤는데 그 값이 없을 때, 2개씩 나오는 것을 체크해줬는데 2개씩이 두 번 나오는지 체크해서 한 번 나오면 3 번식을 두 번 나오면 4 번식으로 계산할 수 있게 해 줬다. 그리고 위의 모든 과정을 거치고도 상금이 계산되어 있지 않으면 주사위 세 개와 같이 정렬을 통해 가장 큰 값이 마지막으로 오게 한 후 마지막 값을 이용해 계산해줬다.
그렇게 n번을 반복해 배열에 저장한 후, 그 배열에서 가장 큰 값을 출력해줬다.
3. 코드 설명
1) 주사위 세개
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int i, m = 0, cnt = 0, t, ans, x = 0;
int a[3], b[7];
for (i = 0; i < 3; i++)
cin >> a[i];
sort(a, a + 3);
for (i = 0; i < 7; i++)
b[i] = 0;
for (i = 0; i < 3; i++)
b[a[i]]++;
for (i = 0; i < 7; i++)
{
if (b[i] == 3)
{
ans = 10000 + i * 1000;
x = 1;
break;
}
if (b[i] == 2)
{
ans = 1000 + i * 100;
x = 1;
break;
}
}
if (x == 0) ans = a[2] * 100;
cout << ans << endl;
}
각 값을 배열 a에 입력받고 정렬해준다. (최댓값을 마지막 항에 넣기 위해)
그리고 배열 b로 주사위 1~6의 값이 몇 번 나오는지 체크해준다. (0으로 초기화 후, 주사위 값이 나온 index에 값 저장)
그리고 그 count 한 값을 이용해 계산해준다. index가 곧 주사위 값이기 때문에 활용하기 쉽다.
x는 모든 눈이 다르게 나온 경우를 판별하기 위해 사용했다. x = 0인 경우가 모든 눈이 다르게 나온 경우이기 때문에 a의 마지막항을 이용해 값을 계산해줬다.
2) 주사위 네 개
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int calc(int a[4])
{
int i, c = 0, ans = 0, t;
int b[7];
for (i = 0; i < 7; i++)
b[i] = 0;
for (i = 0; i < 4; i++)
b[a[i]]++;
for (i = 0; i < 7; i++)
{
if (b[i] == 4) ans = 50000 + i * 5000;
if (b[i] == 3) ans = 10000 + i * 1000;
if (ans != 0) return ans;
}
for (i = 0; i < 7; i++)
{
if (b[i] == 2)
{
c++;
if (c == 1) ans = 1000 + i * 100;
if (c == 2) ans = 2000 + t * 500 + i * 500;
t = i;
}
}
if (ans == 0)
{
sort(a, a + 4);
ans = a[3] * 100;
}
return ans;
}
int main()
{
int i, j, n, m = 0;
vector<int> v;
cin >> n;
for (i = 0; i < n; i++)
{
int a[4];
for (j = 0; j < 4; j++)
cin >> a[j];
v.push_back(calc(a));
}
for (i = 0; i < n; i++)
m = max(m, v[i]);
cout << m << endl;
}
n번씩 각 4번을 던지기 때문에 벡터를 이용했고, 주사위를 4번 던지는 것은 고정이기 때문에 배열을 따로 만들었다. v는 계산한 값을 저장하기 위한 배열이다. a에 주사위를 던진 값을 저장하고 calc 함수에서 값을 계산해서 return 받는다.
calc 함수에서는 위의 문제와 같이 배열 b를 이용해 주사위 값이 각각 몇 번 나왔는지 count 해준다.
그리고 각각 4, 3, 2번 나왔을 때를 계산해준다.
2번 나왔을 때 변수 c는 2번이 두 번씩 나오는지 count 하기 위한 것이다. t는 첫 번째로 두 번이 나온 값의 index, 즉 주사위 값을 저장해주는 변수다. 그리고 위와 마찬가지로 모두 다른 값이 나온 경우 최댓값을 이용해 값을 계산해준다.
'Algorithm' 카테고리의 다른 글
[C++] 백준 7568 덩치 (+Python) (0) | 2021.06.04 |
---|---|
[C++] 백준 2231 분해합 (0) | 2021.06.04 |
[C++] 백준 13458 시험 감독 (0) | 2021.04.21 |
[C++] 백준 9037 The candy war (0) | 2021.04.21 |
[C++] 백준 16675 두 개의 손 (0) | 2021.04.17 |