상세 컨텐츠

본문 제목

백준 2578 : 빙고

밀라 알고리즘 스터디

by qkrtnals 2025. 1. 15. 21:56

본문

💡기본 정보

유형
: 시뮬레이션
풀이 날짜
: 2025년 01월15일 
풀이방법 한줄 요약
: 빙고판과 호출 숫자를 일차적으로 비교하고 빙고의 갯수를 계산해 결과값 냄 

 

💡문제에서 구해야 할 것

25개 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 씀 

5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다

이러한 선이 세 개 이상 그어지는 순간 빙고라고 외치는데 가장 먼저 외치는 사람이 게임의 승자가 됨 

사회자가 몇 번째 수를 부른 후 철수가 빙고를 외치게 되는지를 출력하는 프로그램 작성

- 입력 : 첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례 대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어짐
            빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번 씩 사용됨

  출력 : 첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 빙고를 외치게 되는지 출력

 

💡알고리즘 설계

- 대각선 빙고 ,  가로 빙고 , 세로 빙고인 경우를 나눠서 함수를 제작한 후 해당 시 줄 횟수를 증가

- 대각선 빙고인 경우

   Bingo[0][0] , Bingo[1][1], Bingo[2][2], Bingo[3][3], Bingo[4][4] 
   Bingo[0][4],Bingo[1][3],Bingo[2][2],Bingo[3][1],Bingo[4][0]

- 가로 빙고인 경우

  Bingo[i][0],Bingo[i][1],Bingo[i][2],Bingo[i][3],Bingo[i][4]

- 세로 빙고인 경우

Bingo[0][i],Bingo[1][i],Bingo[2][i],Bingo[3][i],Bingo[4][i]

- 빙고 체크할 시에 빙고판에 있는 숫자와 부르는 숫자가 있는지 체크함

 

💡CODE

const fs = require("fs");
const input = fs.readFileSync(0,"utf8").toString().trim().split("\n");
const board=[];
const Bingo = Array.from({length:5},()=>Array(5).fill(0));
const num = [];

for (let i = 0; i<5;i++){
    board.push(input[i].trim().split(" ").map(Number));
}
for(let i = 5; i<10;i++){
    num.push(input[i].trim().split(" ").map(Number));
}
function BingoCross(){
    let bingo = 0;
    if(Bingo[0][0] && Bingo[1][1] && Bingo[2][2]&& Bingo[3][3]&& Bingo[4][4] ){
        bingo++;
    }
    if(Bingo[0][4]&&Bingo[1][3]&&Bingo[2][2]&&Bingo[3][1]&&Bingo[4][0]){
        bingo++;
    }
    return bingo;
}
function BingoLine(){
    let bingo=0;
    for(let i = 0; i<5;i++){
     if( Bingo[i][0]&&Bingo[i][1]&&Bingo[i][2]&&Bingo[i][3]&&Bingo[i][4]){
        bingo++;
    }
    if(Bingo[0][i]&&Bingo[1][i]&&Bingo[2][i]&&Bingo[3][i]&&Bingo[4][i]){
        bingo++;
    }  
    }

    return bingo;
}
function BingoCheck(){
    for(let i =0; i<5;i++){
        for(let j=0 ; j<5;j++){
            let now=num[i][j];
            board.forEach((row, rowIndex) => {
                row.forEach((value, colIndex) => {
                    if (value === now) {
                        Bingo[rowIndex][colIndex] = 1; 
                    }
                });
            });
            let Bingocross = BingoCross();
            let Bingoline = BingoLine();            
            if(Bingocross + Bingoline >=3){
                return i*5 +(j+1);
            }
        }
    }
    return -1;
}
console.log(BingoCheck());

 

💡시간복잡도

💡 틀린 이유 & 틀린 부분 수정

범위 설정을 잘못함 
Bingo 결과를 불러오는 부분을 너무 앞에 작성함

💡 다른 풀이 or 기억할정보

            board.forEach((row, rowIndex) => {
                row.forEach((value, colIndex) => {
                    if (value === now) {
                        Bingo[rowIndex][colIndex] = 1; 
                    }
                });
            });

각 행과 그 행의 인덱스를 순회하며 현재 불린 숫자 now(Bingo[i][j])가 해당 value에 포함되어 있는지 확인
포함되어있다면 그 부분을 방문했다는 의미로 1로 변환함
 : 행을 돌며 순회하는 부분 

'밀라 알고리즘 스터디' 카테고리의 다른 글

백준 14889 : 스타트와 링크  (0) 2025.01.17
백준 14501 : 퇴사  (0) 2025.01.16
백준 20546 : 기적의 매매법  (0) 2025.01.14
개념 정리 : 시간복잡도 정리  (1) 2025.01.13
백준 1547 : 공  (0) 2025.01.13

관련글 더보기