Algorithm/Implementation

[백준 2578번] 빙고

킹우현 2023. 10. 6. 12:44

 

2578번: 빙고

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

www.acmicpc.net

bingo = [list(map(int,input().split())) for _ in range(5)]

numbers = []

answer = 0

for i in range(5):
    numbers += list(map(int,input().split()))

def delete_number(n):
    for i in range(5):
        for j in range(5):
            if bingo[i][j] == n:
                bingo[i][j] = 0
                return

def count_row(): # 5개가 지워진 행의 개수
    count = 0
    for i in range(5):
        if sum(bingo[i]) == 0:
            count += 1
    return count

def count_col(): # 5개가 지워진 열의 개수
    count = 0
    for i in range(5):
        total = 0
        for j in range(5):
            total += bingo[j][i]
        if total == 0:
            count += 1
    return count

def count_dig(): # 5개가 지워진 대각선의 개수
    count = 0
    if sum([bingo[x][x] for x in range(5)]) == 0:
        count += 1
    if sum([bingo[x][4-x] for x in range(5)]) == 0:
        count += 1
    
    return count

for num in numbers:
    if (count_row() + count_col() + count_dig()) >= 3:
        break

    delete_number(num)

    answer += 1

print(answer)

이번 문제는 주어진 빙고판에서 사회자가 불러준 숫자를 지워나갔을 때, 최초로 빙고를 외치게 되는 시점을 구하는 문제이다.

 

먼저 5개가 지워진 행 / 열 / 대각선이 3개 이상인지, 즉 빙고인지 확인하기 위해 각 행과 열, 대각선 별로 빙고인지 확인하는 함수를 각각 선언해주었다. (숫자를 지울 때 마다 0으로 저장했기 때문에 모든 값의 합이 0인지 확인하면 된다) 또한 사회자가 불러준 숫자를 지우는 함수(delete_number)를 선언하였다.

 

그 후 반복문을 사용하면서 매번 빙고인지 먼저 확인하고, 빙고가 아니라면 사회가자 불러준 숫자를 지워가며 횟수를 카운팅해주는 방식으로 간단하게 풀이하였다 :)