백준 2578 - 빙고

2020-12-25

입력

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

출력

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

깔끔한 방법이 있는지 궁금했지만, 다들 주어진 조건대로 우직하게 풀더라.

빙고 여부를 가려내는 함수를 구현한 뒤 조건을 대입하는 식으로 구현. 그런데, 빙고 여부를 가려내는 함수가 제대로 작동 안 하는지, 한참을 헤맸다.

def isBingo(arr):
    cnt = 0
    # 가로 빙고 여부 확인
    for l in arr:
        if l.count(0) == 5: 
            cnt += 1
    # 세로 확인
    for i in range(5): 
        y = 0
        for j in range(5):
            if arr[j][i] == 0:
                y += 1
        if y == 5:
            cnt += 1
    # 대각선(\) 확인
    k = 0
    for i in range(5): 
        if arr[i][i] == 0:
            k += 1
    if k == 5:
        cnt += 1
    # 대각선(/) 확인
    u = 0
    for i in range(5): 
        if arr[i][4-i] == 0:
            u += 1
    if u == 5:
        cnt += 1
    return cnt

bingo = [] # 빙고판
tutor = [] # 하나씩 부를 숫자
for _ in range(5):
    b = list(map(int, input().split()))
    bingo.append(b)
for i in range(5):
    w = list(map(int, input().split()))
    for j in w:
        tutor.append(j)
for idx, num in enumerate(tutor):
    for m in bingo: # 첫 번째 줄부터 차례로 체크
        if num in m: # 부르는 숫자가 해당 줄에 있으면
            m[m.index(num)] = 0 # 숫자를 0으로 변환
            break
    res = isBingo(bingo) # 맞은 줄이 몇 개인지 확인
    if res >= 3:
        print(idx+1)
        break

[문제 보기]

비슷한 문제 : 틱! 택! 토!