본문 바로가기

백준2578 - 빙고 node.js 본문

개발/algorithm

백준2578 - 빙고 node.js

자전하는명왕성 2024. 1. 9. 09:55

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

문제는 데이터로 빙고판에 써져 있는 수와 사회자가 부르는 수가 주어질 때, 사회자가 몇 번째 수를 부를 때 빙고가 3개 이상이 되는지 묻는다.

 

문제 풀이 방식

문제는 단순하게 접근했다. 

먼저 빙고판에 적혀 있는 숫자들의 좌표를 저장하는 테이블을 만들고, 해당 숫자가 불렸는지 확인할 2차원 배열을 만들었다. (기본값은 false)

이후 사회자가 숫자를 부를 때마다, 테이블에 저장되어 있는 해당 숫자의 좌표에 맞게 2차원 배열의 해당 좌표 위치를 true로 수정했다.

그리고 이때마다 빙고가 3개 이상인지 검증하여 빙고가 3개 이상일 경우 정답을 출력토록 했다.

 

전체 소스 코드

const fs = require("fs");
const input = fs
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt")
  .toString()
  .trim()
  .split("\n");

function solution(data) {
  const arr = data.map((el) => el.split(" ").map(Number));

  const table = {};
  // 수에 따른 좌표 위치 저장
  for (let i = 0; i < 5; i++) {
    for (let j = 0; j < 5; j++) {
      table[arr[i][j]] = [i, j];
    }
  }
  
  // 2배열로 저장된 사회자가 부르는 번호를 1차원으로 변환
  const order = arr.slice(5).flat(); 
  const matrix = Array.from({ length: 5 }, () => {
    return Array.from({ length: 5 }, () => false);
  });
  
  // 빙고 검증 함수
  function verify() {
    let bingo = 0;
    let z1 = 0,
      z2 = 0;
    for (let i = 0; i < 5; i++) {
      let x = 0,
        y = 0;
      if (matrix[i][i]) z1++; // 좌상향 대각선
      if (matrix[i][4 - i]) z2++; // 우상향 대각선

      for (let j = 0; j < 5; j++) {
        if (matrix[i][j]) x++; // 가로축
        if (matrix[j][i]) y++; // 새로축
      }
      if (x == 5) bingo++;
      if (y == 5) bingo++;
    }
    if (z1 == 5) bingo++;
    if (z2 == 5) bingo++;

    return bingo;
  }

  for (let i = 0; i < order.length; i++) {
    const [y, x] = table[order[i]];
    matrix[y][x] = true; // 빙고판 체크
    const bingos = verify();
    if (bingos >= 3) {
      console.log(i + 1);
      break;
    }
  }
}

solution(input);

 

Comments