1 분 소요



https://www.acmicpc.net/problem/2578



🔍 문제 풀이

문제 도식화

2578 도식화

  1. 사회자가 숫자 부를 때마다 cnt++
  2. 부른 숫자를 빙고판에서 찾아서 해당 위치 값을 0으로 변경 (markChange)
  3. nxn (빙고판 전체)을 탐색하며, →↓↘↙ 이 네가지 방향 중 0이 5번 연속 -> Bingo++
  4. checkBingo() 의 반환값이 3 이상이면, cnt를 출력하고 종료


배운 점

각 방향에 대해 0의 개수를 어떻게 체크해야 할지 헤맸는데,
가로는 paper[i][j], 세로는 paper[j][i],
↘ 대각선은 paper[i][i], ↙ 대각선은 paper[i][4 - i] 이렇게
각 방향마다 인덱스를 어떻게 설정해야 할지 명확히 이해할 수 있었다.



💻 전체 코드

import java.io.*;
import java.util.*;

public class Main {
    static int[][] paper;


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int cnt = 0;

        paper =new int[5][5];

        // 빙고판 입력
        for(int i=0; i<5; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j=0; j<5; j++){
                paper[i][j] = Integer.parseInt(st.nextToken());
            }
        }


        // 사회자가 숫자 부름
        for(int i=0; i<5; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j=0; j<5; j++){
                int x = Integer.parseInt(st.nextToken());
                cnt ++;
                markChange(x);

                int bingo = checkBingo();

                if(bingo >= 3){
                    System.out.println(cnt);
                    return;
                }
            }
        }
    }

    // 사회자가 부른 숫자를 0으로 바꾸기
    static void markChange(int x){
        for(int i=0; i<5; i++){
            for(int j=0; j<5; j++){
                if(paper[i][j] == x){
                    paper[i][j] = 0;
                }
            }
        }
    }

    // 빙고 줄 계산
    static int checkBingo(){
        int bingo = 0;
        // →
        for(int i=0; i<5; i++){
            int check = 0;
            for(int j=0; j<5; j++){
                if(paper[i][j]== 0) check++;
            }
            if(check == 5) bingo++;
        }

        // ↓
        for(int i=0; i<5; i++){
            int check = 0;
            for(int j=0; j<5; j++){
                if(paper[j][i]== 0) check++;
            }
            if(check == 5) bingo++;
        }

        // ↘
        int check = 0;
        for(int i=0; i<5; i++){
            if(paper[i][i] == 0) check ++;
        }
        if (check == 5) bingo++;

        // ↙
        check = 0;
        for(int i=0; i<5; i++){
            if(paper[i][4-i] == 0) check++;
        }
        if (check == 5) bingo++;


        return bingo;
    }
}


카테고리:

업데이트:

댓글남기기