-
[백준 2578] 빙고C 프로그래밍/BOJ 2022. 8. 20. 17:13728x90
https://www.acmicpc.net/problem/2578
#include <stdio.h> int board[5 + 2][5 + 2]; int call[5 * 5 + 2]; void input(void) { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { scanf("%d", &board[i][j]); } } for (int i = 0; i < 5 * 5; i++) { scanf("%d", &call[i]); } } void is_number(int n) //사회자가 부른 번호가 빙고판에 있는지 확인하는 함수 { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (board[i][j] == n) { board[i][j] = 0; //지운 숫자 표시 return; } } } return; } int is_bingo(void) //빙고가 되었는지 되지 않았는지 확인하는 함수 { //가로, 대각선 int r_cnt = 0; int c_cnt = 0; int d1_cnt = 0; int d2_cnt = 0; int total = 0; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (board[i][j] == 0) r_cnt++; if ((i == j) && (board[i][j] == 0)) d1_cnt++; if ((i == (4 - j)) && (board[i][j] == 0)) d2_cnt++; } if (r_cnt == 5) total++; r_cnt = 0; //각 행마다 초기화 필요 } if (d1_cnt == 5) total++; if (d2_cnt == 5) total++; //세로 for (int j = 0; j < 5; j++) { for (int i = 0; i < 5; i++) { if (board[i][j] == 0) c_cnt++; } if (c_cnt == 5) total++; c_cnt = 0; //각 열마다 초기화 필요 } return total; } int game(void) { for (int i = 0; i < 25; i++) { is_number(call[i]); int tmp = is_bingo(); if (tmp >= 3) return i; //빙고의 숫자가 3이상이라면 해당 인덱스 번호를 리턴한다 } } int main(void) { input(); int ans = game(); printf("%d", ans + 1); return 0; }
일단.. 풀이에 앞서 위의 내 방법은 절대 좋은 코드가 아니라는 것을 밝힌다 ㅋㅋ..
왜냐하면 개무식하게 스캐닝했기 때문... 구조체 만들어서 인풋 받을 때 좌표 저장하면, 사회자가 부른 번호와 빙고보드의 숫자를 매치하려 매번 스캐닝하지 않아도 된다는데.... 빙고보드가 한 10000개 이상즈음 되면 발등에 불떨어져서 구현하지 않을까 싶다 ㅋㅋ
음.. 다른 함수는 단순 스캐닝에 비교라서 딱히 할말은 없고, 빙고인지 아닌지 확인하는 is_bingo 함수를 잠시 언급하고자 한다.
처음에는 머리가 꼬여서 대체 어떻게 확인해야하지 싶었는데, 그냥 루프 두번씩 두번 돌렸다. (여기에서 만약 빙고판의 크기가 더 커지면 타임아웃 날 것 같기도 ... ) 처음 루프에서는 가로와 왼쪽 대각선, 오른쪽 대각선을 확인했다. 두번째 루프에서는 세로를 확인했다. (이거 두개 합치고 싶었는데... 혹시 방법을 아는 지나가시는 분은 댓글 부탁드립니다.. )
그리고 이때 각 열과 각 행을 다 돌았으면 반드시 r_cnt 와 c_cnt를 초기화하여 다른 행을 탐색할 때 영향을 주지 않도록 해야한다. 나는 이부분 빠트려서 한 30분 더썼다 ㅋㅋ
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 2979] 트럭 주차 (0) 2022.08.20 [백준 2670] 연속부분최대곱 (0) 2022.08.20 [백준 2659] 십자카드 문제 (0) 2022.08.19 [백준 2630] 색종이 만들기 (0) 2022.08.18 [정올 1057] 미친 수열 (0) 2022.08.18