문제
빙고 게임은 다음과 같은 방식으로 이루어진다.
먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다

다음은 사회자가 부르는 수를 차례로 지워나간다. 예를 들어 5, 10, 7이 불렸다면 이 세 수를 지운 뒤 빙고판의 모습은 다음과 같다.

차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.

이러한 선이 세 개 이상 그어지는 순간 "빙고"라고 외치는데, 가장 먼저 외치는 사람이 게임의 승자가 된다.

철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.
출력
첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.
접근 방식
풀이는 간단하다.
사회자가 부르는 수를 체크하면서 현재 빙고가 완성 되었는지를 확인하면 된다.!
이 문제를 풀면서 C++에서 제공하는 count, count_if를 활용해 보았다.
먼저, count 함수는 범위 안에 원소들 중 특정값과 일치하는 변수의 개수를 반환하는 함수이고
count_if는 범위 안에 원소들 중 특정 조건에 만족하는 변수의 개수를 반환하는 함수이다..!
두 함수를 적절히 활용하면 매번 2중 반복문으로 복잡하게 코드를 구현하지 않아도 되어 편했다..
코드
#include <bits/stdc++.h>
using namespace std;
int mat[5][5];
map<int, pair<int, int>> m;
bool isBingo() {
int cnt = 0;
// 행과 열 체크
for (int i = 0; i < 5; i++) {
if (count(mat[i], mat[i] + 5, -1) == 5) cnt++; // 행 체크
if (count_if(mat, mat + 5, [&](int row[5]) { return row[i] == -1; }) == 5) cnt++; // 열 체크
}
// 대각선 체크
bool diag1 = true, diag2 = true;
for (int i = 0; i < 5; i++) {
if (mat[i][i] != -1) diag1 = false;
if (mat[i][4 - i] != -1) diag2 = false;
}
if (diag1) cnt++;
if (diag2) cnt++;
return cnt >= 3;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
cin >> mat[i][j];
m[mat[i][j]] = {i, j};
}
}
// 사회자가 부르는 숫자 처리
for (int i = 0; i < 25; i++) {
int x;
cin >> x;
mat[m[x].first][m[x].second] = -1; // 해당 숫자에 -1 표시
if (isBingo()) {
cout << i + 1 << '\n';
return 0;
}
}
return 0;
}
'Algorithm' 카테고리의 다른 글
[BOJ] 원상 복구 (small) 22858번 C++ (0) | 2024.11.09 |
---|---|
[BOJ] 단어 뒤집기 2 17413번 C++ (0) | 2024.11.06 |
[BOJ] 기적의 매매법 20546번 C++ (0) | 2024.10.31 |
[BOJ] 트리 1068번 C++ (0) | 2024.10.31 |
[BOJ] Costume Party 6159번 C++ (0) | 2024.10.25 |