happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/C++ 문제풀이

[백준] 빙고

2022. 11. 27. 21:03

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

 

2578번: 빙고

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

www.acmicpc.net

문제부터 간단하게 요약하면, 빙고판이 주어지고, 사회자가 부르는 숫자들도 주어집니다. 이 때, 사회자가 몇번 째 수를 부른 후 빙고줄이 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
    '코딩테스트/C++ 문제풀이' 카테고리의 다른 글
    • [정올] Uniqueness
    • [백준] 연속부분최대곱
    • [백준] 자리배정
    • [백준] 싸이클
    happy318
    happy318

    티스토리툴바