코딩테스트

백준 빙고(c++)

leeeehhjj 2024. 2. 17. 13:45

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

 

2578번: 빙고

첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로

www.acmicpc.net

 

#include <iostream>
#include <map>
using namespace std;
 
int A[5+10][5+10];
int B[25+10];
int R[5];
int C[5];
int side1;
int side2;
bool visitedR[5];
bool visitedC[5];
bool visitedSide1;
bool visitedSide2;
map<int, pair<int,int>> m;
void InputData(){
    for (int i=0; i<5; i++){
        for (int j=0; j<5; j++){
            cin >> A[i][j];
            m[A[i][j]] = make_pair(i,j);
        }
    }
    for (int i=0; i<25; i++){
        cin >> B[i];
    }
}
 
int cnt = 0;
 
int solve() {
    for(int i=0; i<25; i++) {
        pair<int,int> p = m[B[i]];
        R[p.first]++;
        C[p.second]++;
        if (p.first == p.second) 
            side1++;
        if(p.first == (4-p.second)) {side2++;}
        if(R[p.first] == 5 && !visitedR[p.first]) {cnt++; visitedR[p.first] = true;}
        if(C[p.second] == 5 && !visitedC[p.second]) {cnt++; visitedC[p.second] = true;}
        if(side1 == 5 && !visitedSide1) {cnt++; visitedSide1=true;}
        if(side2 == 5 && !visitedSide2) {cnt++; visitedSide2 = true;}
 
        if (cnt >= 3) return i+1;
    }
}
 
int main(){
    int ans = -1;
    InputData();// 입력받는 부분
 
    // 여기서부터 작성
    ans = solve();
 
 
    cout << ans << endl;// 출력하는 부분
    return 0;
}