관리 메뉴

cococo-coding

[C++ 풀이] 2484번. 주사위 네개 본문

[BOJ] 코드 모음/C++_learning 문제집

[C++ 풀이] 2484번. 주사위 네개

_dani 2024. 1. 18. 01:47

문제

 

풀이

브론즈 2이지만 정답률이 꽤 낮은 문제이다. 

주사위를 4번 던져 각 나온 수별로 리워드값을 계산해야하는데, 같은 눈이 2개씩 두쌍이 나오는 경우와 한쌍이 나오는 경우를 구분해야 한다.

 

1. 참여자의 수 n을 입력받는다. while문으로 돌려준다.

이때 가장 큰 상금자를 찾을 벡터 vector <int> win; 을 선언하고

같은눈이 2개씩 2쌍이 나오는 경우와 1쌍이 나오는 경우를 구분지을 start 변수도 선언한다.

 

2. 주사위 수가 몇개씩 나온지 카운팅할 벡터 v(7,0)을 선언해준다. (크기가 7이고, 0으로 채운다는 뜻)

for문을 이용해 주사위를 던져 나온 수를 v[수]++; 처리해준다.

 

3. 이제 규칙에 따라 상금을 정해줄 것이다.

for문으로 1부터 6까지 돌려주면서 상금을 구한다.

1) v[i]==4 인 경우는 같은 수가 4번 나온 경우

2) v[i]==3 인 경우는 같은 수가 3번 나온 경우

3) v[i]==2 인 경우는 2개가 최소 1쌍은 나온 경우 (-> 2개가 2쌍이 나온 경우는 마지막에 따로 처리)

4) 주사위 수가 다 다른 경우는 모두 v[i]==1 이므로, break없이 포문을 돌려서 가장 마지막에 나온 숫자를 리워드로 계산한다.

5) 가장 마지막으로 3번에서 거르지 못한 2개가 2쌍씩 나온 경우를 따로 처리한다.

이때 3번에서 i를 start변수로 받아놨었다. 

따라서 start+1부터 6까지 사이에서 주사위 수가 2개 나온 경우를 다시 찾는다.

v[j]==2가 존재한다면 2개가 2쌍이 나온 리워드로 처리한다. 

 

리워드값을 구했다면, win벡터에 푸시해준다.

 

4. win벡터를 내림차순으로 정렬해주고, 가장 앞의 원소 win[0]을 출력한다. 

 


위에서 2개가 1쌍이 나온 경우와 2개가 2쌍이 나온 경우를 같이 처리하려고 여러번 시도를 했으나 계속 실패했다.

아래 코드가 계속 오류가 났던 코드다. 

//3-3. 2쌍이 2개 나온 경우
            else if (v[i] == 2) {
                for (int j = i + 1; j < 7; j++) {
                    if (v[j] != 2) {
                        reward = 2000 + i * 500 + j * 500;                       
                        break;
                    } //2쌍이 1개만 나온 경우
                    else {
                        reward = 1000 + i * 100;                      
                        break;
                    }
                }
            }

 

그래서 우선은 2쌍이 1개라도 있는 경우를 먼저 써주고, 맨 마지막에 2쌍이 1개 더 있는 경우를 따로 처리해주었다. 

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

/*
    1. 참여자 수 n을 입력받는다.
    2. 각 사람이 던진 4개의 눈을 입력받는다.
    3. 각 사람별로 상금을 계산한다.
    4. 가장 높은 상금을 뽑는다.
    5. 가장 높은 상금을 출력한다.
*/

int main() {
    //1
    int n;
    cin >> n;

    vector <int> win; //가장 큰 상금자 찾기
    
    int start = 0;

    //2
    while (n--) {
        vector <int> v(7,0); //주사위 수 카운팅할 벡터

        int a=0; //주사위 4번 던지기
        for (int i = 0; i < 4; i++) {
            cin >> a;
            v[a]++;
        }

        //3
        int reward = 0;
        for (int i = 1; i < 7; i++) {
            //3-1. 같은 수 4개 나옴
            if (v[i] == 4) {
                reward = 50000 + i * 5000;
                break;
            }
            //3-2. 같은 수 3개 나옴
            else if (v[i] == 3) {
                reward = 10000 + i * 1000;
                break;
            }
            //3-3. 2쌍이 1개 나온 경우
            else if (v[i] == 2) {
                        reward = 1000 + i * 100;
                        start = i;
                        break;                                
            }
            //3-4. 다 다른 경우
            else {
                if (v[i] == 1) {
                    reward = i * 100;
                    //break가 없어야 가장 끝에있는 큰 수로 reward계산됨
                }
            }

        }
        //3-5. 2쌍이 2개나온경우 따로 빼줌
        for (int j = start+1; j < 7; j++) {
            if (v[j] == 2) {
                reward = 2000 + start * 500 + j * 500;
                break;
            }
        }
        win.push_back(reward);
    }

    //4
    sort(win.rbegin(), win.rend());
    //5
    cout << win[0] << '\n';

    return 0;
}

 

레벨에 비해 어려웠던 문제였다.. 다들 파이팅!!!