
내가 생각했을때 문제에서 원하는부분
첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다.
여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다.
빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.
첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.
내가 이 문제를 보고 생각해본 부분
입력 처리:
BufferedReader와 BufferedWriter를 사용하여 입력과 출력을 처리해준다.
Block 클래스를 정의하여 각 숫자의 (행, 열) 위치를 저장합니다. x는 열, y는 행을 나타낸다.
빙고판 입력:
첫 번째 루프에서 5x5 빙고판의 숫자를 입력받는다.
각 숫자는 1부터 25까지의 자연수이며, 해당 숫자의 위치를 bing 배열에 Block 객체로 저장한다.
사회자가 부르는 숫자 입력:
두 번째 루프에서 사회자가 부르는 숫자를 입력받는다.
각 숫자가 불릴 때마다 해당 숫자의 위치를 찾아 현재 행과 열을 확인한다.
빙고 체크:
부른 숫자의 행과 열에 대해 각각의 카운트를 증가시킨다.
또한, 두 대각선에 대해서도 체크한다.
왼쪽 위에서 오른쪽 아래 대각선을 체크한다.
오른쪽 위에서 왼쪽 아래 대각선을 체크한다.
각 방향에서의 카운트가 5에 도달하면 빙고가 발생한 것으로 간주한다.
결과 출력:
만약 빙고가 3개 이상 발생한 경우, 해당 차례(cnt)를 ans에 저장합니다. 모든 숫자가 불린 후, 결과를 출력한다.
코드로 구현
package baekjoon.baekjoon_27;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
// 백준 2578번 문제
public class Main950 {
static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 좌표를 저장하기 위한 Block 클래스
static class Block {
int x, y; // x는 열, y는 행
Block(int y, int x) {
this.y = y;
this.x = x;
}
}
public static void main(String args[]) throws Exception {
Block[] bing = new Block[25]; // 1부터 25까지의 숫자에 대한 위치 저장
int[][] bingGo = new int[2][5]; // 빙고 체크를 위한 배열 (0: 열, 1: 행)
int[] diagonal = new int[2]; // 대각선 체크를 위한 배열 (0: 왼쪽 위에서 오른쪽 아래, 1: 오른쪽 위에서 왼쪽 아래)
int n, ans = 0, cnt = 0, bingCnt = 0; // n: 현재 숫자, ans: 빙고가 발생한 차례, cnt: 호출된 숫자 수, bingCnt: 빙고 수
// 빙고판 입력 및 숫자 위치 저장
for(int i = 0; i < 5; i++) {
String[] in = br.readLine().split(" ");
for(int j = 0; j < 5; j++) {
n = Integer.parseInt(in[j]);
bing[n - 1] = new Block(i, j); // 숫자 n의 위치를 Block 객체로 저장
}
}
// 사회자가 부르는 숫자 입력
for(int i = 0; i < 5; i++) {
String[] in = br.readLine().split(" ");
for(int j = 0; j < 5; j++) {
if(ans != 0) // 이미 빙고가 발생한 경우
continue; // 다음 숫자로 넘어감
cnt++; // 호출된 숫자 수 증가
n = Integer.parseInt(in[j]); // 현재 부른 숫자
int nowY = bing[n - 1].y; // 현재 숫자의 행
int nowX = bing[n - 1].x; // 현재 숫자의 열
// 해당 열의 빙고 체크
if(++bingGo[0][nowX] >= 5)
bingCnt++;
// 해당 행의 빙고 체크
if(++bingGo[1][nowY] >= 5)
bingCnt++;
// 왼쪽 위에서 오른쪽 아래 대각선 체크
if(nowX == nowY)
if(++diagonal[0] >= 5)
bingCnt++;
// 오른쪽 위에서 왼쪽 아래 대각선 체크
if(nowX + nowY == 4)
if(++diagonal[1] >= 5)
bingCnt++;
// 빙고가 3개 이상 발생했는지 체크
if(bingCnt >= 3)
ans = cnt; // 몇 번째 숫자에서 빙고가 발생했는지 저장
}
}
// 결과 출력
bw.write(ans + "\n");
bw.flush();
bw.close();
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.