1. 문제
https://www.acmicpc.net/problem/2578
2. 풀이과정
1. 5x5 배열로 빙고 보드를 초기화
2. 1부터 25까지의 숫자를 순서대로 부름
3. 숫자를 부를 때마다 해당 숫자가 빙고 보드에 있는지 확인하고, 있으면 해당 칸을 0으로 변경하고 빙고의 개수를 체크
4. 빙고의 갯수가 3줄 이상이 되면 그때의 숫자 순서를 출력
changeBingo : 해당 칸을 0으로 변경하는 함수
checkBingo : 현재 보드판의 빙고 갯수를 반환하는 함수
-> 이중 반복문을 활용해 0이 연속 5개가 나온다면 빙고 개수를 1 증가시키는 방식으로 구현
📛주의했던 점
빙고줄이 현재 2줄에서 다음 숫자 부름에서 빙고줄이 바로 4줄이 되는 경우 고려 필요
if (checkBingo() == 3) //틀림
if (checkBingo() >= 3) //맞음
3. C++ 정답코드
#include <iostream>
#include <vector>
using namespace std;
void changeBingo(int target);
int checkBingo();
const int BINGO_SIZE = 5;
int board[BINGO_SIZE][BINGO_SIZE];
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
for (int i = 0; i < BINGO_SIZE; i++)
{
for (int j = 0; j < BINGO_SIZE; j++)
{
cin >> board[i][j];
}
}
int sayCnt = 0;
for (int i = 0; i < BINGO_SIZE * BINGO_SIZE; i++)
{
int num;
cin >> num;
sayCnt++;
changeBingo(num);
if (checkBingo() >= 3) {
cout << sayCnt;
return 0;
}
}
return 0;
}
void changeBingo(int target)
{
for (int i = 0; i < BINGO_SIZE; i++){
for (int j = 0; j < BINGO_SIZE; j++){
if (board[i][j] == target){
board[i][j] = 0;
return;
}
}
}
return;
}
int checkBingo()
{
int bingoCnt = 0;
for (int i = 0; i < BINGO_SIZE; i++) //가로, 세로 빙고 확인
{
int horizontal = 0, vertical = 0;
for (int j = 0; j < BINGO_SIZE; j++){
if (!board[i][j])
horizontal++;
if (!board[j][i])
vertical++;
}
if (horizontal == BINGO_SIZE) bingoCnt++;
if (vertical == BINGO_SIZE) bingoCnt++;
}
int right_diagonal = 0, left_diagonal = 0;
for (int i = 0; i < BINGO_SIZE; i++) //대각선 2개 빙고 확인
{
if (!board[i][i]) right_diagonal++;
if (!board[i][BINGO_SIZE - i - 1]) left_diagonal++;
}
if (right_diagonal == BINGO_SIZE) bingoCnt++;
if (left_diagonal == BINGO_SIZE) bingoCnt++;
return bingoCnt;
}

'🏆 PS(Problem Solving) > Baekjoon' 카테고리의 다른 글
[Node.js] 백준 Javascript 4396 지뢰 찾기 (0) | 2024.06.01 |
---|---|
[Node.js] 백준 javascript 2578 빙고 (0) | 2024.05.30 |
[C++] 백준 20546 기적의 매매법 (1) | 2024.05.29 |
[Node.js] 백준 Javascript 20546 기적의 매매법 (0) | 2024.05.28 |
[C++] 백준 14467 소가 길을 건너간 이유1 (0) | 2024.05.28 |
1. 문제
https://www.acmicpc.net/problem/2578
2. 풀이과정
1. 5x5 배열로 빙고 보드를 초기화
2. 1부터 25까지의 숫자를 순서대로 부름
3. 숫자를 부를 때마다 해당 숫자가 빙고 보드에 있는지 확인하고, 있으면 해당 칸을 0으로 변경하고 빙고의 개수를 체크
4. 빙고의 갯수가 3줄 이상이 되면 그때의 숫자 순서를 출력
changeBingo : 해당 칸을 0으로 변경하는 함수
checkBingo : 현재 보드판의 빙고 갯수를 반환하는 함수
-> 이중 반복문을 활용해 0이 연속 5개가 나온다면 빙고 개수를 1 증가시키는 방식으로 구현
📛주의했던 점
빙고줄이 현재 2줄에서 다음 숫자 부름에서 빙고줄이 바로 4줄이 되는 경우 고려 필요
if (checkBingo() == 3) //틀림
if (checkBingo() >= 3) //맞음
3. C++ 정답코드
#include <iostream>
#include <vector>
using namespace std;
void changeBingo(int target);
int checkBingo();
const int BINGO_SIZE = 5;
int board[BINGO_SIZE][BINGO_SIZE];
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
for (int i = 0; i < BINGO_SIZE; i++)
{
for (int j = 0; j < BINGO_SIZE; j++)
{
cin >> board[i][j];
}
}
int sayCnt = 0;
for (int i = 0; i < BINGO_SIZE * BINGO_SIZE; i++)
{
int num;
cin >> num;
sayCnt++;
changeBingo(num);
if (checkBingo() >= 3) {
cout << sayCnt;
return 0;
}
}
return 0;
}
void changeBingo(int target)
{
for (int i = 0; i < BINGO_SIZE; i++){
for (int j = 0; j < BINGO_SIZE; j++){
if (board[i][j] == target){
board[i][j] = 0;
return;
}
}
}
return;
}
int checkBingo()
{
int bingoCnt = 0;
for (int i = 0; i < BINGO_SIZE; i++) //가로, 세로 빙고 확인
{
int horizontal = 0, vertical = 0;
for (int j = 0; j < BINGO_SIZE; j++){
if (!board[i][j])
horizontal++;
if (!board[j][i])
vertical++;
}
if (horizontal == BINGO_SIZE) bingoCnt++;
if (vertical == BINGO_SIZE) bingoCnt++;
}
int right_diagonal = 0, left_diagonal = 0;
for (int i = 0; i < BINGO_SIZE; i++) //대각선 2개 빙고 확인
{
if (!board[i][i]) right_diagonal++;
if (!board[i][BINGO_SIZE - i - 1]) left_diagonal++;
}
if (right_diagonal == BINGO_SIZE) bingoCnt++;
if (left_diagonal == BINGO_SIZE) bingoCnt++;
return bingoCnt;
}

'🏆 PS(Problem Solving) > Baekjoon' 카테고리의 다른 글
[Node.js] 백준 Javascript 4396 지뢰 찾기 (0) | 2024.06.01 |
---|---|
[Node.js] 백준 javascript 2578 빙고 (0) | 2024.05.30 |
[C++] 백준 20546 기적의 매매법 (1) | 2024.05.29 |
[Node.js] 백준 Javascript 20546 기적의 매매법 (0) | 2024.05.28 |
[C++] 백준 14467 소가 길을 건너간 이유1 (0) | 2024.05.28 |