https://www.acmicpc.net/problem/2578
문제부터 간단하게 요약하면, 빙고판이 주어지고, 사회자가 부르는 숫자들도 주어집니다. 이 때, 사회자가 몇번 째 수를 부른 후 빙고줄이 3줄 이상이 되는지를 출력해야 합니다.
<Solution>
5x5로 사이즈가 고정이므로 가로 5줄, 세로 5줄, 대각선 2줄에 대해 int array를 만들어 놓고 숫자가 불릴때 마다 증가시켜 5가 되면 빙고 줄 수를 하나 늘려주는 형태로 구현하면 쉽게 카운팅이 가능합니다.
실제 구현은 아래와 같습니다.
#include <iostream>
using namespace std;
int A[5+10][5+10];
int B[25+10];
int row_cnt[5];
int col_cnt[5];
int cross_cnt[2];
int bingo_cnt;
void InputData(){
for (int i=0; i<5; i++){
for (int j=0; j<5; j++){
cin >> A[i][j];
}
}
for (int i=0; i<25; i++){
cin >> B[i];
}
}
void check_bingo(int r, int c){
if(row_cnt[r] != 5){
row_cnt[r] ++;
if(row_cnt[r] == 5) bingo_cnt++;
}
if(col_cnt[r] != 5){
col_cnt[c] ++;
if(col_cnt[c] == 5) bingo_cnt++;
}
if (cross_cnt[0]!=5){
if (r==c){
cross_cnt[0] ++;
if(cross_cnt[0] == 5) bingo_cnt++;
}
}
if (cross_cnt[1] != 5){
if (r+c == 4){
cross_cnt[1] ++;
if(cross_cnt[1] ==5) bingo_cnt++;
}
}
}
int sol(){
for(int i = 0; i<25; i++){
//find position
int r= 0;
int c= 0;
for(r = 0; r<5; r++){
int bf = 0;
for(c= 0; c<5; c++){
if (A[r][c] == B[i]) {
bf = 1;
break;
}
}
if(bf== 1) break;
}
check_bingo(r,c);
if(bingo_cnt >= 3){
return (i+1);
}
}
// never reach
return 0;
}
int main(){
int ans = -1;
InputData();
ans = sol();
cout << ans << endl;
return 0;
}
반응형
'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글
[정올] Uniqueness (0) | 2022.11.27 |
---|---|
[백준] 연속부분최대곱 (0) | 2022.11.27 |
[백준] 자리배정 (0) | 2022.11.27 |
[백준] 싸이클 (0) | 2022.11.27 |
[정올] 숫자근(Digit Root) (0) | 2022.11.27 |