ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 2578] 빙고
    C 프로그래밍/BOJ 2022. 8. 20. 17:13
    728x90

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

     

    2578번: 빙고

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

    www.acmicpc.net

    #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

    댓글

Designed by Tistory.