본문 바로가기

너와!나의!알고!리즘!/백준

[백준 #2578, Python] 빙고

[풀이]

from sys import stdin
from collections import deque
def bingo_find(i,j):
    total = 0
    #가로 찾기
    for r in range(5):
        if sum(visit[r][0:5]) == 5:
            total += 1

    #세로 찾기
    for c in range(5):
        col = 0
        for r in range(5):
            if visit[r][c] == 1:
                col += 1
            if col == 5:
                total += 1

    #대각선 찾기
    right_down = left_down = 0
    for i in range(5):
        if visit[i][i] == 1:
            right_down += 1
        if visit[i][4-i] == 1:
            left_down += 1
    #전체 빙고 개수
    if left_down == 5:
        total += 1
    elif right_down == 5:
        total += 1
    return total
positions = [0]*(26) #빙고판의 숫자별 위치 저장
for r in range(5):
    tmp = list(map(int, stdin.readline().split()))
    for c in range(5):
        positions[tmp[c]] = ((r,c))
numbers =[] #사회자의 숫자들

for _ in range(5): #1차원 list로 받아오기
    numbers += list(map(int,stdin.readline().split()))
numbers = deque(numbers)

cnt = 0 #사회자가 부른 숫자의 개수
visit =[[0]*5 for _ in range(5)] #숫자 불려지면 체크 용도
while numbers:
    num = numbers.popleft()
    cnt +=1
    i,j = positions[num]
    visit[i][j] = 1
    if bingo_find(i,j) >= 3:
        print(cnt)
        break

99%인가? 실패해가지고 도대체 이유가 뭐지,,했는데 처음에 마지막 bingo를 확인하기 위해서 함수를 넣어주었을때 불러준 숫자의 개수가 13개 이상일때만 들어가게 했다. (3개이상 빙고가 생길려면 저 cnt가 최소라고 생각했음) 그걸 없애주니까 잘 돌아간다. 약간 무식하지만, 번호들은 하나의 큐 형태로 받아서 지속적으로 popleft를 해주어서 visit라는 함수에 방문 표시를 해준다. 그리고 그 이후에 함수를 전체적으로 돌려서 빙고수 확인!