백준 2484 - 주사위 네개
문제링크
문제 접근
- 주사위 눈(1~6)이 나온 횟수를 각각 기록한다. 배열의 인덱스는 0~5 이므로 주사위 눈을 계산할 때는 (인덱스 + 1)을 해준다.
- 4개 혹은 3개가 같은 눈이 나오는 경우는 각각 한가지 뿐이므로, 주사위 눈이 나온 횟수를 기록한 배열에서 4 혹은 3이 나오는 경우 해당 상금을 계산한다.
- 2개가 같은 눈이 나오는 경우 배열에 해당 눈의 값을 기록한다. 벡터 컨테이너의 size() 메서드를 통해 2개씩 2쌍이 같은 경우인지 아닌지 확인할 수 있다. 따라서, 각각의 경우에 해당하는 상금을 계산한다.
- 위 과정을 반복했을 때 계산된 상금이 없다면 6개의 주사위 눈 중 4개가 한번씩 나온 경우뿐이다. 따라서, 주사위 눈의 횟수가 기록된 배열에서 1을 원소로 가지는 배열의 인덱스 중 가장 큰 값을 찾는다. 그리고 상금을 계산한다.
- 모든 경우의 수에 상금을 계산해두었으므로 최댓값을 찾아 출력한다.
의사코드(pseudo-code)
# define function
- int findMax(vector<int> &v)
- max = v[0]
- for i=1 to v.size()-1:
- if max < v[i]:
- max = v[i]
- return max
# main
- cin >> N
- vector<int> prize(N,0)
- for j=0 to N-1:
- vector<int> dice_cnt(6,0)
- for i=0 to 3:
- cin >> tmp
- dice_cnt[tmp-1] += 1
- vector<int> v
- for i=0 to 5:
- if dice_cnt[i]==4:
- prize[j] = 50000 + (i+1) * 5000
- else if dice_cnt[i]==3:
- prize[j] = 10000 + (i+1) * 1000
- else if dice_cnt[i]==2:
- v.push_back(i+1)
- if v.size()==2:
- prize[j] = 2000 + v[0]*500 + v[1]*500
- else if v.size()==1:
- prize[j] = 1000 + v[0]*100
- else if prize[j]==0:
- val = 1
- for k=1 to 5:
- if dice_cnt[k]==1:
- val = k+1
- prize[j] = val * 100
- cout << findMax(prize) << "\n"
소스코드 및 분석
전체 코드
#include <iostream>
#include <vector>
using namespace std;
int findMax(vector<int> &v) {
int max = v[0];
for (int i = 1; i < v.size(); i++) {
if (max < v[i]) {
max = v[i];
}
}
return max;
}
int main()
{
int N;
cin >> N;
vector<int> prize(N, 0);
for (int j = 0; j < N; j++) {
vector<int> dice_cnt(6, 0);
for (int i = 0; i < 4; i++) {
int tmp;
cin >> tmp;
dice_cnt[tmp - 1] += 1;
}
vector<int> v;
for (int i = 0; i < 6; i++) {
if (dice_cnt[i] == 4)
prize[j] = 50000 + (i + 1) * 5000;
else if (dice_cnt[i] == 3)
prize[j] = 10000 + (i + 1) * 1000;
else if (dice_cnt[i] == 2)
v.push_back(i + 1);
}
if (v.size() == 2)
prize[j] = 2000 + v[0] * 500 + v[1] * 500;
else if (v.size() == 1)
prize[j] = 1000 + v[0] * 100;
else if (prize[j] == 0) {
int val = 1;
for (int k = 1; k < 6; k++) {
if (dice_cnt[k] == 1) val = k + 1;
}
prize[j] = val * 100;
}
}
cout << findMax(prize) << "\n";
}
- 함수 findMax 는 벡터 컨테이너에서 최댓값을 찾는 함수이다.
- 벡터 컨테이너 v 는 2번 나온 주사위 눈의 값을 담아두는 변수이다.
- 모두 다른 주사위 눈만 나온 경우를 살펴보면, 변수 val 은 주사위 눈 1을 가리키며 시작한다. 주사위 눈이 나온 횟수를 담아두는 변수 dice_cnt 를 탐색하다가 1을 발견하면 해당 주사위 눈의 값을 저장한다. 최종 저장된 값이 나왔던 주사위 눈 중 가장 큰 값이다.
- 계산한 상금의 최댓값을 출력한다.
Leave a comment