[백준] 2578 빙고

Python
avatar
2025.04.26
·
5 min read

문제

빙고 게임은 다음과 같은 방식으로 이루어진다.
먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다.

5579


다음은 사회자가 부르는 수를 차례로 지워나간다. 예를 들어 5, 10, 7이 불렸다면 이 세 수를 지운 뒤 빙고판의 모습은 다음과 같다.

5580

차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.

5581

이러한 선이 세 개 이상 그어지는 순간 "빙고"라고 외치는데, 가장 먼저 외치는 사람이 게임의 승자가 된다.

5582

철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.


입력

첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.


출력

첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.


내 풀이

import sys
input = sys.stdin.readline

board = []
for _ in range(5):
    board.append(list(map(int, input().split())))
    
announcement = []
for _ in range(5):
    announcement.append(list(map(int, input().split())))
    
announcement = [col for row in announcement for col in row]

def find_index(matrix, value):
    for i, row in enumerate(matrix):
        if value in row:
            return (i, row.index(value))
        
for index, v in enumerate(announcement):
    bingo_count = 0
    idx = find_index(board, v)
    board[idx[0]][idx[1]] = True
    
    # row-wise
    for i in range(5):
        if board[i] == [True, True, True, True, True]:
            bingo_count += 1
    
    if bingo_count >= 3:
        print(index+1)
        break
    
    # column-wise
    for i in range(5):
        cnt = 0
        for j in range(5):
            if board[j][i] == True:
                cnt += 1
        if cnt == 5:
            bingo_count += 1
    
    if bingo_count >= 3:
        print(index+1)
        break

    # diagonal-1
    cnt = 0
    for i in range(5):
        if board[i][i] == True:
            cnt += 1         
    if cnt == 5:
        bingo_count += 1
        
    if bingo_count >= 3:
        print(index+1)
        break
    
    #diagonal-2
    cnt = 0
    for i in range(5):
        if board[i][4-i] == True:
            cnt += 1
    if cnt == 5:
        bingo_count += 1
        
    if bingo_count >= 3:
        print(index+1)
        break

코멘트

우선 빙고 게임을 진행하기 위해 사회자가 부른 숫자를 True로 변환하여 빙고가 만들어지는지 체크하도록 했다. 빙고는 가로 줄, 세로 줄, 대각선의 경우가 있으므로 이 줄에서 True가 5개 있으면 빙고 1줄로 인식하도록 했다.

처음에는 bingo 함수를 따로 만들어서 한꺼번에 빙고가 성립하는지를 확인했는데, 그렇게 하면 후반부에 숫자 하나를 부름으로써 한꺼번에 몇 개의 빙고 줄이 완성되었을 때를 대처할 수가 없어서 함수를 따로 만들지 않고 가로 줄을 체크하고 난 뒤에 3개의 선이 있는지, 세로 줄을 체크하고 난 뒤에 3개의 선이 있는지, 대각선을 체크하고 난 뒤에 3개의 선이 있는지를 단계별로 계속 체크하는 방식으로 바꾸었다. 생각보다 로직 짜기가 까다로웠다.


References

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







- 컬렉션 아티클