Coding Problem

[BOJ 2578] 빙고

Yepchani 2025. 3. 19. 20:00
반응형

문제

빙고

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

 

 

풀이

설명

사회자가 몇 번째 수를 부른 후에 빙고를 외치게 되는지를 구하는 문제입니다.

 

일반적인 빙고 규칙을 가집니다.

빙고 카운트가 3개가 되어야 "빙고"를 외칠 수 있습니다.

 

숫자가 불릴 때마다 전체 빙고 개수를 확인하는 대신, 다음과 같은 방법을 사용했습니다.

  1. 각 숫자의 빙고판 상 위치를 저장합니다.
  2. 각 행, 열, 대각선별로 채워진 칸 수를 추적합니다.
  3. 불린 숫자의 위치에 해당하는 행, 열, 대각선만 업데이트합니다.

 

예시 코드

function solution() {
  const TARGET_BINGO_COUNT = 3;

  const n = 5;
  const board = Array.from({ length: n }, () => input().split(" ").map(Number));
  const numberPositions = new Map();
  board.forEach((row, i) => {
    row.forEach((num, j) => {
      numberPositions.set(num, [i, j]);
    });
  });

  const rowCounts = Array(n).fill(0);
  const colCounts = Array(n).fill(0);
  let diag1Count = 0,
    diag2Count = 0;
  let bingoCount = 0;

  const calledNumbers = Array.from({ length: n }, () =>
    input().split(" ").map(Number)
  ).flat();

  for (let i = 0; i < calledNumbers.length; i++) {
    const num = calledNumbers[i];
    if (numberPositions.has(num)) {
      const [row, col] = numberPositions.get(num);
      updateBingo(row, col);

      if (bingoCount >= TARGET_BINGO_COUNT) return i + 1;
    }
  }

  return "No bingo";

  function updateBingo(row, col) {
    if (++rowCounts[row] === n) bingoCount++;
    if (++colCounts[col] === n) bingoCount++;
    if (row === col && ++diag1Count === n) bingoCount++;
    if (row + col === n - 1 && ++diag2Count === n) bingoCount++;
  }
}

'Coding Problem' 카테고리의 다른 글

[BOJ 2622] 삼각형만들기  (0) 2025.03.21
[BOJ 2659] 십자카드 문제  (0) 2025.03.20
[BOJ 2548] 대표 자연수  (0) 2025.03.17
[BOJ 10610] 30  (0) 2025.03.16
[BOJ 3151] 합이 0  (0) 2025.03.15