2578번 빙고

개나뇽·2024년 4월 16일
0

문제 링크

문제 요약

  1. 5x5크기의 빙고판이 있으며 빙고판에는 1 - 25 사이의 자연수가 입력된다.
  2. 사회자가 1부터 25사이의 숫자를 부르고 불러진 숫자는 빙고판에서 지운다.
  3. 지워진 숫자가 가로줄,세로줄, 대각선(왼쪽, 오른쪽 포함)으로 이어진 선이 3개 이상이라면 빙고라고 외친다.
  4. 가장 먼저 외치는 사람이 승자다.
  5. 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.

입력 예제

접근 방법

static int[][] map = new int[5][5]; // 빙고판
static int num; // 사회자가 몇 번째 수를 불렀는지 체크하는 변수
static int count; // 빙고의 갯수 

먼저 5x5의 빙고판을 만드는 이차원 배열, 사회자가 몇 번째 수를 불렀는지 저장할 변수, 빙고의 갯수를 저장할 변수를 만든다.

for(int i =0; i < 5; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0; j < 5; j++){
map[i][j] = Intger.parseInt(st.netxToken());
	}
}

반복문을 이용하여 빙고판을 채운다.

for(int i = 0; i < 5; i++){
StringTokenizer st = new StiringTokenizer(br.readLine());
for(int j = 0; j < 5; j++){
	num++;
    binggo(Intger.psrseInt(st.nextToken()));
    bingoCheck();
    if(count => 3){
    return;
    	}
    }
}

사회자가 숫자를 발표하는 반복문이다. 빙고 카운트가 3보다 크거나 같은경우 메서드를 종료한다.

public static void binggo(int n){
for(int i = 0; i < 5; i++){
	for(int j = 0; j < 5; j++){
    	if(map[i][j] == n){
        map[i][j] = -1;
        	} 
		}
	}
}

public static void bingoCheck(){
count = 0;
int row; 가로줄
int col; 세로줄
int xy = 0; 우측 대각
int tx = 0; 좌측 대각
int index = 0; // 대각선 위치를 확인시 사용하는 변수
for(int i = 0; i < 5; i++){
	row = 0;
    col = 0;
    
    for(int j = 0; j < 5; j++){
    row += map[i][j];
    col += map[j][i];
    
    if(i ==j){
    	xy += map[i][j]
    }
            
   if(i == index && j == 4 - index){
   	yx += map[j][i];
    index++;
   }
   	}
    if (row == -5) {
        count++;
      }
      if (col == -5) {
        count++;
      }
      if (xy == -5) {
        count++;
      }
      if (yx == -5) {
        count++;
      }
	}
}

사회자가 부른 숫자는 빙고판에서 -1로 변경하여 다시 불리는 것을 방지한다.
각줄의 합을 구했을시 -5라면 빙고카운트를 1씩 상승한다.

  • 이해가 어려웠던 부분 index와 i는 같은 값을 가지는것 아닌가?

    일단 용도가 다르다.
    i는 빙고 보드의 행을 반복한다.
    index는 빙고 보드의 두 번째 대각선에 있는 셀의 열 인덱스를 추적하며 두번째 대각선에 대한 조건을 충족했을때만 값이 상승한다.

profile
정신차려 이 각박한 세상속에서!!!

0개의 댓글