백준_2578_빙고

임정민·2023년 1월 19일
2

알고리즘 문제풀이

목록 보기
18/173
post-thumbnail

코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67

문제

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

[나의 풀이]

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main{
	
    // 빙고판 만들기
    static int [][] makeBoard(int board [][],BufferedReader br,BufferedWriter bw) throws IOException{

        StringTokenizer st;

        for(int i=0;i<5;i++){
            st = new StringTokenizer(br.readLine());
            for (int j=0;j<5;j++){
                int el = Integer.parseInt(st.nextToken());
                board[i][j] = el;
                
            }
        }

        return board;
    }
	
    // 빙코 체크 목록
    static int [] makeCheck(int [] check,BufferedReader br,BufferedWriter bw) throws IOException{

        StringTokenizer st;

        for(int i=1;i<6;i++){
            st = new StringTokenizer(br.readLine());
            for (int j=1;j<6;j++){
                int el = Integer.parseInt(st.nextToken());
                check[5*(i-1)+j-1] = el;
            }
        }

        return check;
    }
	
    // 빙고 점수 내기
    static int counting(int [][] board,int [] check) throws IOException{
        int cnt = 0;
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));


        for (int i=0;i<check.length;i++){

            cnt ++;
            int bingo = 0;
            Boolean find = false;
            for(int j=0;j<5;j++){
                for(int k=0;k<5;k++){

                    if (board[j][k] == check[i]){
                        board[j][k] = -1;
                        find = true;

                        if(find){
                            break;
                        }
                    }
                }
                if(find){
                    break;
                }
            }

            int [] diagonal = new int [5];
            int [] vertical = new int [5];
            int idx_dia = 0;

            for(int j=0;j<5;j++){
                int idx_ver = 0;
                if(Arrays.stream(board[j]).sum()==-5){
                    bingo ++;
                }
                
                for(int k=0;k<5;k++){
                    if(j+k==4){
                        diagonal[idx_dia] = board[j][k];
                        idx_dia++;
                    }
                    vertical[idx_ver] = board[k][j];
                    idx_ver++;
                }
                if(Arrays.stream(vertical).sum()==-5){
                    bingo ++;
                }
            }

            if(Arrays.stream(diagonal).sum()==-5){
                bingo++;
            } 

            if (bingo>=3){
                break;
            }
        }

        return cnt;
    }

    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int board [][] = new int [5][5];
        int check [] = new int [25];
        int cnt = 0;
		
        board = makeBoard(board, br, bw); // 빙고판 만들기
        check = makeCheck(check, br, bw); // 빙고 체크 목록 
        cnt = counting(board, check);     // 빙고 점수 내기

        bw.write(String.valueOf(cnt));
        bw.flush();
    }
}

[팀원의 풀이]

# coding = utf-8
import sys
input = sys.stdin.readline

bn = 5
bingo = list(list(map(int,input().split())) for _ in range(bn))
call = list(list(map(int,input().split())) for _ in range(bn))
visited = list(list(False for _ in range(bn)) for _ in range(bn))

def printboard(board) :
    for row in board :
        print(row)


def erasenum(n, bingo, visited) :
    for i in range(bn) :
        for j in range(bn) :
            if bingo[i][j] == n :
                visited[i][j] = True
                return

def checkbingo(visited) :
    ch = 0
    # 가로 check
    for row in visited :
        if row.count(True) == bn :
            ch += 1
    # 세로 check
    for i in range(bn) :
        tmp = 0
        for j in range(bn) :
            if visited[j][i] == True :
                tmp += 1
        if tmp == bn :
            ch += 1
    # 좌상 우하 대각선 check
    tmp = 0
    for i in range(bn) :
        if visited[i][i] == True :
            tmp += 1
    if tmp == bn :
        ch += 1
    # 우상 좌하 대각선 check
    tmp = 0
    for i in range(bn):
        if visited[i][-i-1] == True:
            tmp += 1
    if tmp == bn:
        ch += 1

    return ch

def sol() :
    res = 0
    for row in call :
        for num in row :
            erasenum(num, bingo, visited)
            res += 1
            if checkbingo(visited) >= 3 :
                return res

print(sol())
profile
https://github.com/min731

0개의 댓글