본문 바로가기

백준

2578 빙고

허어.. 이것도 어렵다. 

 

먼저 배열 두개를 만들어서 하나는 숫자를 저장하고 하나는 불렀던 숫자인지 체크한다. 

다음으로 빙고가 되기까지 숫자 12개가 필요하므로 11개까지 숫자를 미리 부른 다음에 다음부터 값을 하나씩 넣으면서 빙고인제 체크한다. 

 

 

 

 

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

int main() {
    vector <int> num(25);
    vector <bool> check(25);
    
    //num 배열에 숫자 초기화 
    for(int i = 0; i < 25; i++){
        int input;
        scanf("%d", &input);
        num[i] = input; check[i] = false;
    }
    
    //부른 숫자 11개 체크
    for(int i = 0; i < 11; i++){
        int input;
        scanf("%d", &input);
        check[input] = true;
    }
    
    //숫자 하나 부르고 빙고인지 체크
    for(int k = 12; k <= 25; k++){
    	//숫자 하나 부름
        int input;
        scanf("%d", &input);
        check[input] = true;
        
        //빙고 개수 센다
        int bingo = 0;
        for(int i = 0; i < 5; i++){
        	//가로 빙고 있는지
            if(check[num[i+0]] == true && check[num[i+1]] == true && check[num[i+2]] == true 
            && check[num[i+3]] == true && check[num[i+4]] == true)
                bingo++;
            //세로 빙고 있는지
            if(check[num[0+i]] == true && check[num[5+i]] == true && check[num[10+i]] == true 
            && check[num[15+i]] == true && check[num[20+i]] == true)
                bingo++; 
        }
        //대각선 빙고 있는지
        if(check[num[0]] == true && check[num[6]] == true && check[num[12]] == true 
            && check[num[18]] == true && check[num[24]] == true)
                bingo++;
        if(check[num[4]] == true && check[num[8]] == true && check[num[12]] == true 
            && check[num[16]] == true && check[num[20]] == true)
                bingo++;
        //만약 빙고가 3개 이상이라면 끝!
        if(bingo >= 3){
            printf("%d", k);
            break;
        }
    }
    return 0;
}

음.. 이렇게 했는데 출력되는게 아무것도 없다. 조금 더 생각해봐야겠다. 

 


void print_num(vector <int> &v){
    for(int i = 0; i < v.size(); i++){
        printf("%d ", v[i]);
        
        if(i % 5 == 4)
            printf("\n");
    }
}

void print_check(vector <bool> &v){
    for(int i = 1; i < v.size(); i++){
        cout << v[i];
        
        if(i % 5 == 0)
            cout << endl;
    }
}

.. 모르겠어서 그냥 출력하면서 어느 부분이 문제인지 봤다. 그래서 배열 출력하는 함수 만듬

함수 두 개 만든 이유는 두 배열 크기가 달라서 따로 만들었음. check는 26칸으로 만들어서 index와 숫자가 똑같게 만들어줬다. 

 

//num 배열에 숫자 초기화 
    for(int i = 0; i < 25; i++){
        int input;
        scanf("%d", &input);
        num[i] = input; check[i] = false;
    }
    check[25] = false;
    
    print_num(num);
    printf("\n");
    
    
    //부른 숫자 11개 체크
    for(int i = 0; i < 11; i++){
        int input;
        scanf("%d", &input);
        check[input] = true;
    }
    
    print_check(check);
    printf("\n");

 

이까지 했을 때 출력결과이다. 잘 들어갔다! 결과는 15지만 13이 나와서 어디가 틀렸는지 계속 살펴봐야 할 것 같다. 

 

 

 

k가 12일때 18이 들어왔다. check 배열의 18번째 칸을 true로 만들어줬다. 여기는 문제 안 생기는 것 같고.. 보니 13번째에 숫자 세는 게 문제인 것 같다. 

 

13번째 값이 들어왔을 때 가로세로는 1개 대각선은 1개가 돼야 하는데 가로세로 부분에서 2개가 됐다. 그래서 이 부분을 살펴보니 조건을 잘못 세웠다. 

//가로 빙고 있는지
            if(check[num[i+0]] == true && check[num[i+1]] == true && check[num[i+2]] == true 
            && check[num[i+3]] == true && check[num[i+4]] == true)

이거 처음에는 0, 1, 2, 3, 4를 비교하는데 i가 1이 되면 1, 2, 3, 4, 5를 비교한다ㅋㅋㅋ 그래서 이 부분을 아래와 같이 고쳤다. 

 

if(check[num[5*i+0]] == true && check[num[5*i+1]] == true && check[num[5*i+2]] == true 
            && check[num[5*i+3]] == true && check[num[5*i+4]] == true)

이제 잘 돌아간다!

 

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

int main() {
    vector <int> num(25);
    vector <bool> check(26);
    
    //num 배열에 숫자 초기화 
    for(int i = 0; i < 25; i++){
        int input;
        scanf("%d", &input);
        num[i] = input; check[i] = false;
    }
    check[25] = false;
    
    //부른 숫자 11개 체크
    for(int i = 0; i < 11; i++){
        int input;
        scanf("%d", &input);
        check[input] = true;
    }
    
    //숫자 하나 부르고 빙고인지 체크
    for(int k = 12; k <= 25; k++){
    	//숫자 하나 부름
        int input;
        scanf("%d", &input);
        check[input] = true;
        
        //빙고 개수 센다
        int bingo = 0;
        for(int i = 0; i < 5; i++){
        	//가로 빙고 있는지
            if(check[num[5*i+0]] == true && check[num[5*i+1]] == true && check[num[5*i+2]] == true 
            && check[num[5*i+3]] == true && check[num[5*i+4]] == true)
                bingo++;
            //세로 빙고 있는지
            if(check[num[0+i]] == true && check[num[5+i]] == true && check[num[10+i]] == true 
            && check[num[15+i]] == true && check[num[20+i]] == true)
                bingo++; 
        }
        //대각선 빙고 있는지
        if(check[num[0]] == true && check[num[6]] == true && check[num[12]] == true 
            && check[num[18]] == true && check[num[24]] == true)
                bingo++;
        if(check[num[4]] == true && check[num[8]] == true && check[num[12]] == true 
            && check[num[16]] == true && check[num[20]] == true)
                bingo++;
        //만약 빙고가 3개 이상이라면 끝!
        if(bingo >= 3){
            printf("%d", k);
            break;
        }
    }
    return 0;
}

 

 

맞았다!! 야호!

'백준' 카테고리의 다른 글

10163 색종이  (0) 2019.10.27
1408 24  (0) 2019.10.27
1834 나머지와 몫이 같은 수  (0) 2019.10.25
2851 슈퍼마리오  (0) 2019.10.25
2460 지능형기자 2  (0) 2019.10.25