백준 2484 - 주사위 네개

2 minute read

문제링크

문제 접근

  • 주사위 눈(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