[백준] 2578_빙고 python

김동완·2022년 4월 16일
0

알고리즘

목록 보기
5/55
post-thumbnail

빙고

문제

빙고 게임은 다음과 같은 방식으로 이루어진다.

먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다

img

다음은 사회자가 부르는 수를 차례로 지워나간다. 예를 들어 5, 10, 7이 불렸다면 이 세 수를 지운 뒤 빙고판의 모습은 다음과 같다.

img

차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.

img

이러한 선이 세 개 이상 그어지는 순간 "빙고"라고 외치는데, 가장 먼저 외치는 사람이 게임의 승자가 된다.

img

철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.

입력

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

출력

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

해결방법

  • 빙고판을 받아온 후 빙고가 되는 경우의 수 12가지를 미리 파악한다.
    • 가로빙고, 세로빙고(행렬 전환 후 가로 고려), 대각선 빙고
  • 숫자와 빙고판을 돌면서 숫자가 선언되면 빙고판에서 숫자를 삭제한다.
  • 빙고판이 빈리스트가 되면 cnt를 1 씩 올려주고 cnt가 3이면 종료한다.

bingo1 = [list(map(int,input().split()))for i in range(5)] #빙고판 불러오기 (가로 빙고 5개 )
bingo2 = list(map(list,zip(*bingo1)))   #빙고판 행렬전환 (세로 빙고 5개)

bingo3 = [];bingo4 = []
for i in range(len(bingo1)) :
    bingo3.append(bingo1[i][i]) #빙고 왼쪽 대각선
    bingo4.append(bingo2[i][4-i]) #빙고 오른쪽 대각선 
bingo = bingo1+bingo2
bingo.append(bingo3)
bingo.append(bingo4) #빙고가 되는 경우의 수 12가지 만들기 

lst = []
for i in range(5) :
    lst += list(map(int,input().split())) #숫자 불러오기 
n = 0
for i in lst :
    n +=1
    cnt = 0
    for j in bingo :
        if i in j :
            j.remove(i) #숫자가 선언되면 빙고 경우의 수 리스트에서 수를 지우기 
        if j == [] : #빈 리스트이면 cnt + 1
            cnt +=1
    if cnt >= 3: #빙고가 세개이면 종료 
        break
print(n)    
profile
내가 공부한 내용들이 누군가에게 도움이 될지 몰라서 쓰는 벨로그

0개의 댓글