백준 2578번 빙고 문제 풀이(Python, 구현, Silver4)

전승재·2024년 2월 19일
0

알고리즘

목록 보기
76/88

백준 빙고 문제 바로가기

문제 접근


빙고는 거의 민속놀이라 다들 아실거같숩니다.
사회자가 몇 번째 수를 부른 후 빙고가 3개 이상이 되는지를 출력하는 프로그램을 만들어야 합니다.
그래서 저는 부른 숫자를 체크하는 기능과 빙고판에 빙고가 몇개인지를 확인하는 기능을 구현해서 그때의 사회자가 부른 숫자의 번호를 저장하고 그를 출력하는 방식으로 문제를 풀고자 했습니당.

문제 풀이

숫자 체크하기

사회자는 총 25개의 숫자를 부르는데 한줄에 5개씩 넣어서 부르기 때문에 call이라는 리스트에 입력을 잠시 담았습니다.
그리고 철수의 빙고판을 pan에 저장했고 이를 사회자가 부른 숫자와 대조하여 만약 같다면 visited에 같은 위치를 1로 만들어 체크하는 방식으로 진행했습니다.

for i in range(5):
    call = list(map(int, sys.stdin.readline().split()))
    for n in range(5):
        for x in range(5):
            for y in range(5):
                if call[n]==pan[x][y]:
                    visited[x][y] = 1
        

빙고가 몇개인지 체크하기

빙고의 개수를 체크하기 위해서 cal_score이라는 함수를 만들어 빙고의 개수를 체크했습니다.
빙고판의 가로, 세로, 대각선을 체크하여 bingo라는 변수에 빙고의 개수를 넣었습니다.

def cal_score():
    bingo = 0
    for i in range(5):
        if sum(visited[i]) == 5:
            bingo += 1
    for i in range(5):
        cnt = 0
        for j in range(5):
            cnt += visited[j][i]
        if cnt == 5:
            bingo += 1
    cnt = 0
    for i in range(5):
        cnt += visited[i][i]
    if cnt==5:
        bingo += 1
    cnt = 0
    for i in range(5):
        cnt += visited[4-i][i]
    if cnt==5:
        bingo += 1
    return bingo

이렇게 구해낸 빙고의 개수가 3개이상이 될때, result가 한번도 변하지 않았을 때에 result에 사회자가 부른 숫자가 몇번째인지를 구해 result에 넣어주었습니당.

제출 코드

import sys
pan = []

for i in range(5):
    line = list(map(int, sys.stdin.readline().split()))
    pan.append(line)

visited = [[0 for i in range(5)] for j in range(5)]

def cal_score():
    bingo = 0
    for i in range(5):
        if sum(visited[i]) == 5:
            bingo += 1
    for i in range(5):
        cnt = 0
        for j in range(5):
            cnt += visited[j][i]
        if cnt == 5:
            bingo += 1
    cnt = 0
    for i in range(5):
        cnt += visited[i][i]
    if cnt==5:
        bingo += 1
    cnt = 0
    for i in range(5):
        cnt += visited[4-i][i]
    if cnt==5:
        bingo += 1
    return bingo
result = 0
for i in range(5):
    call = list(map(int, sys.stdin.readline().split()))
    for n in range(5):
        for x in range(5):
            for y in range(5):
                if call[n]==pan[x][y]:
                    visited[x][y] = 1
        
        if cal_score()>=3 and result==0:
            result = 5*(i) + n+1
            
    
print(result)

0개의 댓글