관리 메뉴

어읽로꾸거

BOJ 17281 ⚾(삼성 A형 기출) 본문

알고리즘

BOJ 17281 ⚾(삼성 A형 기출)

어읽로꾸거 2020. 5. 14. 21:01

백준 17281 ⚾(야구)

https://www.acmicpc.net/problem/17281

 

17281번: ⚾

⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종��

www.acmicpc.net

 

요즘 삼성 A형 기출을 풀어보고 있다.

코로나 끝나면 외출 끊어서 삼성 코테 보러 갈꺼임.

 

문제 이름이 그림이다. 특이함.

 

풀이

가능한 선수 타자 배치를 만든다. p_list 배열에다가 만듦. 여기서 1번 선수는 무조건 4번 타자이다.

아마 처음은 2 3 4 1 5 6 7 8 9 일꺼고 이런식으로 재귀를 통하여 모든 경우의 수를 구현한다.

 

그 후 각 경우에 대하여 야구 경기를 시뮬레이션 한다. 그리고 최대값 갱신 끝.

경기 시뮬 부분을 좀 더 잘 짤 수 있었을것 같은데 생각이 안난다. 하드코딩 한 것 같은데 아닌 것 같기도 하고.

 

삼성 A형은 풀다 보면 유형이 어느정도 정해진 것 같다. DP처럼 기록하기거나, 각 경우에 대해 생각하고 구현하기 등등

 

색종이 문제도 이 유형과 비슷한 것 같다.

https://www.acmicpc.net/problem/17136

 

17136번: 색종이 붙이기

<그림 1>과 같이 정사각형 모양을 한 다섯 종류의 색종이가 있다. 색종이의 크기는 1×1, 2×2, 3×3, 4×4, 5×5로 총 다섯 종류가 있으며, 각 종류의 색종이는 5개씩 가지고 있다. <그림 1> 색종이를 크��

www.acmicpc.net

 

 

코드

 

#include<bits/stdc++.h>
using namespace std;
int N;
int player[52][10];
int p_list[10];
bool isin[10];
int ans;

int gethit(int inning, int num){
    return player[inning][p_list[num]];
}

void simulate(){
    int score = 0;
    int p_num = 1;
    for(int i=1;i<=N;i++){
        bool base[4]={0,0,0,0};
        int out = 0;
        while(out<3){
            if(p_num==10) p_num=1;
            if(gethit(i, p_num) == 0){ 
                out++;
            }
            else if(gethit(i, p_num) == 1){
                if(base[3]){
                    base[3]=0; score++;
                }
                if(base[2]){
                    base[3]=1; base[2]=0;
                }
                if(base[1]){
                    base[2]=1; base[1]=0;
                }
                base[1]=1;
            }
            else if(gethit(i, p_num) == 2){
                if(base[3]){
                    base[3]=0; score++;
                }
                if(base[2]){
                    base[2]=0; score++;
                }
                if(base[1]){
                    base[3]=1; base[1]=0;
                }
                base[2]=1;
            }
            else if(gethit(i, p_num) == 3){
                if(base[3]){
                    base[3]=0; score++;
                }
                if(base[2]){
                    base[2]=0; score++;
                }
                if(base[1]){
                    base[1]=0; score++;
                }
                base[3]=1;
            }
            else if(gethit(i, p_num) == 4){
                if(base[3]){
                    base[3]=0; score++;
                }
                if(base[2]){
                    base[2]=0; score++;
                }
                if(base[1]){
                    base[1]=0; score++;
                }
                score++;
            }
            p_num++;
        }
    }
    //cout<<score<<'\n';
    ans = max(ans, score);
}

void dfs(int idx, int n){
    if(idx==4){
        dfs(idx+1,n);
        return;
    }
    p_list[idx]=n;
    isin[n]=1;
    if(idx == 9){
        simulate();
    }
    else{
        for(int i=2;i<10;i++){
            if(!isin[i]){
                dfs(idx+1,i);
            }
        }
    }
    isin[n]=0;
}

void solve(){
    for(int i=2;i<10;i++){
        dfs(1,i);
    }
}

int main(){
    //1번부터 9번까지 총 9명
    ans = 0;
    cin>>N;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=9;j++){
            cin>>player[i][j];
        }
    }
    p_list[4]=1; isin[1]=1;
    
    solve();
    cout<<ans;
}

'알고리즘' 카테고리의 다른 글

BOJ 15647 로스팅하는 엠마도 바리스타입니다  (0) 2019.09.19
BOJ 3187 양치기 꿍  (0) 2019.09.15
BOJ 14613 너의 티어는?  (0) 2019.09.15
BOJ 1038 감소하는 수  (0) 2019.09.15
BOJ 17141 연구소 2  (0) 2019.09.13