본문 바로가기

BAEKJOON/구현

백준 2578번 [빙고](C++) -yes6686- 티스토리

728x90
SMALL

백준 문제 풀이: 2578


문제 링크: https://www.acmicpc.net/problem/2578

문제 설명:

해당 문제는 빙고판에서 숫자를 불러, 3개의 빙고 줄이 완성되는 순간을 찾는 문제입니다. 문제의 전체 내용은 위 링크에서 확인할 수 있습니다.


문제 해결 코드

#include <iostream>
using namespace std;

pair<int, int> arr[26]; // 좌표 저장
int s[26];
int rowCnt[6] = {0}, colCnt[6] = {0}, diagCnt[3] = {0};
int totalCnt = 0;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    // 5x5 배열에 입력된 숫자의 좌표를 저장
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= 5; j++) {
            int x;
            cin >> x;
            arr[x] = {i, j};
        }
    }

    // 부른 숫자 순서 저장
    for (int i = 1; i <= 25; i++) {
        cin >> s[i];
    }

    // 숫자 하나씩 처리
    for (int i = 1; i <= 25; i++) {
        auto [r, c] = arr[s[i]]; // 좌표 가져오기
        rowCnt[r]++;
        colCnt[c]++;
        if (r == c) diagCnt[1]++;       // 첫 번째 대각선
        if (r + c == 6) diagCnt[2]++;   // 두 번째 대각선

        // 빙고 개수 계산
        if (rowCnt[r] == 5) totalCnt++;
        if (colCnt[c] == 5) totalCnt++;
        if (r == c && diagCnt[1] == 5) totalCnt++;
        if (r + c == 6 && diagCnt[2] == 5) totalCnt++;

        // 빙고가 3개 이상일 때 출력
        if (totalCnt >= 3) {
            cout << i << '\n';
            return 0;
        }
    }
}

코드 설명

위 코드는 주어진 빙고판에서 숫자를 순서대로 부르며 빙고가 3줄 이상 완성되는 순간을 찾아 출력하는 알고리즘입니다. 주요 로직은 다음과 같습니다:

  1. 빙고판의 각 숫자의 좌표를 arr 배열에 저장합니다.
  2. 입력된 순서대로 숫자를 불러 빙고 여부를 체크합니다.
  3. 가로, 세로, 대각선 빙고 줄의 상태를 각각 확인하고, 빙고 줄이 3개 이상이 되면 해당 숫자의 순서를 출력합니다.

결과

위 코드를 통해 문제를 해결할 수 있었으며, 효율적인 방식으로 빙고 여부를 확인하는 로직을 구현하였습니다. 다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
LIST