N

(SWEA c++)6781. 삼삼 트리플 게임 본문

SW Expert Academy

(SWEA c++)6781. 삼삼 트리플 게임

naeunchan 2020. 11. 19. 17:02
728x90
반응형

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWgqpQV6r8gDFAW0&categoryId=AWgqpQV6r8gDFAW0&categoryType=CODE

 

카드의 색깔과 숫자를 string 형태로 받아와서 한꺼번에 처리했다.

char형 벡터 R, G, B를 선언하여, 카드 수를 받고 정렬하였다.

 

check함수를 통해 규칙을 찾아내면 된다.

우선 count1, count2로 해당 카드 색깔의 카드 수를 인덱스에 맞춰 늘려주도록 한다.

그리고 2가지 방법으로 규칙을 찾아야 하기 때문에 count1, count2를 이용하였다.

각 벡터마다 for문을 2번씩, 총 4번을 돌아야한다.

 

count1

우선 동일 색상에서 동일한 숫자 3장을 확인한다.

첫번째 for문) for문을 돌면서 해당 숫자의 카드가 3장 이상이면 r1을 늘려주고, 해당 숫자의 카드 수를 -3 시켜준다.

두번째 for문) 1 ~ 7까지 for문을 돌면서 i, i + 1, i + 2의 카드 수가 1장 이상이면 r1을 늘려주고, 카드 수를 각각 -1 해준다.

                  여기서 i 또한 -1 시켜주어 연속된 숫자의 카드가 남아있는지 확인을 계속 해줘야 한다.

 

count2

위의 for문을 반대로 해주면 된다.

세번째 for문) 1 ~ 7까지 반복하여, 연속된 숫자의 카드가 남아있을 때까지 검사하여 r2를 늘려준다.

네번재 for문) 카드의 수가 3장 이상인지 확인한 후 r2를 늘려준다.

 

2가지 경우를 생각하여 완전탐색을 진행하면 정답..!

 

 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int ans = 0;
int r1 = 0;
int r2 = 0;

void check(vector<char> card)
{
    vector<int> count1(10, 0), count2(10, 0);
    
    sort(card.begin(), card.end());
    
    for(int i = 0; i < card.size(); i++)
    {
        int num = card[i] - '0';
        count1[num]++;
        count2[num]++;
    }
    
    for(int i = 1; i < 10; i++)
    {
        if(count1[i] >= 3)
        {
            r1++;
            count1[i] -= 3;
        }
    }
    for(int i = 1; i < 8; i++)
    {
        if(count1[i] > 0 && count1[i + 1] > 0 && count1[i + 2] > 0)
        {
            r1++;
            count1[i]--;
            count1[i + 1]--;
            count1[i + 2]--;
            i--;
        }
    }
    
    for(int i = 1; i < 8; i++)
    {
        if(count2[i] > 0 && count2[i + 1] > 0 && count2[i + 2] > 0)
        {
            r2++;
            count2[i]--;
            count2[i + 1]--;
            count2[i + 2]--;
            i--;
        }
    }
    for(int i = 1; i < 10; i++)
    {
        if(count2[i] >= 3)
        	r2++;
    }
}

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int t;
    cin >> t;
    
    for(int tc = 1; tc <= t; tc++)
    {
        string card, color;
        vector<char> R,G,B;
        
        ans = 0;
        r1 = 0, r2 = 0;
        
        cin >> card;
        cin >> color;
        
        for(int i = 0; i < 9; i++)
        {
            if(color[i] == 'R')
                R.push_back(card[i]);
            else if(color[i] == 'G')
                G.push_back(card[i]);
            else
                B.push_back(card[i]);
        }
        
        if(R.size() > 0)
            check(R);
        if(G.size() > 0)
            check(G);
        if(B.size() > 0)
            check(B);
        
        cout << "#" << tc << " ";
        if(r1 >= 3 || r2 >= 3)
            cout << "Win" << endl;
        else
            cout << "Continue" << endl;
    }
    return 0;
}
728x90
반응형