1. 문제
https://www.acmicpc.net/problem/2578
2. 풀이과정
입력받은 초기 빙고판의 값 -> 2차원 배열에 저장
사회자가 말하는 숫자 25개 -> 1차원 배열에 저장
1. 5 x 5 2차원 배열에 초기 방고판 구성
2. 사회자가 말하는 숫자마다 빙고판 체크, 빙고줄 개수 체크
- 빙고판 체크 -> 해당 숫자 칸을 0으로 변경
- 빙고줄 갯수 체크 -> 가로, 세로, 좌우 대각선 총 4가지를 조사해 총 빙고줄 검사
3. 빙고줄 갯수 체크 시 빙고를 만족한다면(3줄 이상) 몇 번째 숫자였는지 출력하고 종료
checkBingo(): 현재 보드에서 빙고의 개수를 확인하고 반환합니다. 가로, 세로, 대각선 방향으로 빙고를 검사합니다.
markNumber(): 주어진 숫자를 보드에서 찾아서 마킹합니다. 해당 숫자를 보드에서 0으로 변경하여 중복해서 처리하지 않도록 합니다.
findBingo(): 게임을 진행하면서 빙고가 3개 이상이 될 때까지 숫자를 하나씩 확인합니다. 빙고가 3개 이상이 되면 해당 숫자를 출력하고 게임을 종료합니다.
❗주의할 점
빙고줄이 2줄에서 다음 숫자 말하기에서 바로 4줄이 되어버리는 경우가 존재함
따라서 빙고가 3줄일때만 종료하면 안 됨
checkBingo() >= 3 //올바른 종료조건 ✅
checkBingo() == 3 //잘못된 종료조건 ❌
3. Javascript 정답 코드
const fs = require('fs');
const inputFilePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(inputFilePath, 'utf-8').trim().split('\n').map(line => line.split(' ').map(Number));
const BOARD_SIZE = 5;
const board = input.slice(0, BOARD_SIZE);
const says = input.slice(BOARD_SIZE).flat();
const checkBingo = () => {
let bingoCount = 0;
for (let i = 0; i < BOARD_SIZE; i++) {
let horizontal = 0, vertical = 0;
for (let j = 0; j < BOARD_SIZE; j++) {
if (!board[i][j]) horizontal++;
if (!board[j][i]) vertical++;
}
if (horizontal === BOARD_SIZE) bingoCount++;
if (vertical === BOARD_SIZE) bingoCount++;
}
let rightDiagonal = 0, leftDiagonal = 0;
for (let i = 0; i < BOARD_SIZE; i++) {
if (!board[i][i]) rightDiagonal++;
if (!board[i][BOARD_SIZE - i - 1]) leftDiagonal++;
}
if (rightDiagonal === BOARD_SIZE) bingoCount++;
if (leftDiagonal === BOARD_SIZE) bingoCount++;
return bingoCount;
}
const markNumber = (number) => {
for (let i = 0; i < BOARD_SIZE; i++) {
for (let j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] === number) {
board[i][j] = 0;
return;
}
}
}
}
const findBingo = () => {
let sayCount = 0;
for (let i = 0; i < BOARD_SIZE * BOARD_SIZE; i++) {
sayCount++;
markNumber(says[i]);
if (checkBingo() >= 3) {
console.log(sayCount);
return;
}
}
}
findBingo();
'🏆 PS(Problem Solving) > Baekjoon' 카테고리의 다른 글
[C++] 백준 4396 지뢰 찾기 (0) | 2024.06.01 |
---|---|
[Node.js] 백준 Javascript 4396 지뢰 찾기 (0) | 2024.06.01 |
[C++] 백준 2578 빙고 (0) | 2024.05.30 |
[C++] 백준 20546 기적의 매매법 (1) | 2024.05.29 |
[Node.js] 백준 Javascript 20546 기적의 매매법 (0) | 2024.05.28 |