💡기본 정보
유형
: 시뮬레이션
풀이 날짜
: 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 |