[백준] 2578번 빙고 . python

sun1·2023년 3월 4일
0

im_test

목록 보기
16/22
post-thumbnail

문제

' 2578번 빙고 '
https://www.acmicpc.net/problem/2578

풀이

조건

  • 첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수를 입력값으로 주어진다.
  • 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다.
  • 빙고판과 사회자가 부르는 수는 모두 1부터 25까지의 수이다.
  • 빙고가 3개 이상 그어지는 순간 사회자가 부른 수를 출력한다.

풀이 순서

  • 빙고판 배열과 사회자가 부른 숫자 배열을 입력값으로 받는다.
  • 빙고인지 확인하는 함수를 만든다.
  • 사회자가 부른 숫자와 동일한 빙고판 숫자는 0으로 지운다. ( 사회자는 1 이상 25 이하 값만 부르기 때문에 )
  • 3개의 빙고줄이 만들어지기 위한 최소 지워야하는 갯수는 12개이므로 사회자가 12개 이상을 부른 순간순간 함수로 돌아가 빙고줄이 몇개인지 체크한다.
  • 빙고가 3개 이상이면 그때 사회자가 부른 숫자가 얼마인지 출력한다.

코드

Python

def check(tmp):
    # 가로
    for i in range(5):
        if bingo[i] == [0] * 5:
            tmp += 1
    # 세로
    for i in range(5):
        if all(bingo[j][i] == 0 for j in range(5)):
            tmp += 1
    # 대각선1
    if all(bingo[i][i] == 0 for i in range(5)):
        tmp += 1
    # 대각선2
    if all(bingo[i][4 - i] == 0 for i in range(5)):
        tmp += 1
    return tmp

bingo = [list(map(int, input().split())) for _ in range(5)]
speak = []
for _ in range(5):
    speak += list(map(int, input().split()))
cnt = 0
tmp = 0
for i in range(25):
    for x in range(5):
        for y in range(5):
            if speak[i] == bingo[x][y]:
                bingo[x][y] = 0
                cnt += 1
    if cnt >= 12:
        result = check(tmp)
        if result >= 3:
            print(i + 1)  # 배열은 0 부터 시작했으므로 
            break

다른 방법

def check(arr):
    total=0
    #가로
    k=[0,1,2,3,4]
    for i in range(5):
        if arr[i][0]==0:
            tmp=0
            for K in k:
                if arr[i][0+K]==0:
                    tmp+=1
            if tmp == 5:
                total+=1
    #세로
    for i in range(5):
        if arr[0][i]==0:
            tmp=0
            for K in k:
                if arr[0+K][i]==0:
                    tmp+=1
            if tmp == 5:
                total+=1
    #대각선1
    tmp=0
    for K in k:
        if arr[0+K][0+K] == 0:
            tmp+=1
    if tmp == 5:
            total+=1
    #대각선2
    tmp=0
    for K in k:
        if arr[0+K][4-K] == 0:
            tmp+=1
    if tmp == 5:
            total+=1

    if total >=3:
        return True
    else:
        return

arr=[list(map(int,input().split()))for _ in range(5)]
call=[]
for _ in range(5):
    call+=map(int,input().split())
cnt=0
for k in range(25): #순서조심!!
    for i in range(5):
        for j in range(5):
            if arr[i][j] == call[k]:
                arr[i][j]=0
                cnt+=1
                break
    if cnt>=12:
        t=check(arr)
        if t==True:
            print(k+1)
            break

0개의 댓글