문제
빙고 게임은 다음과 같은 방식으로 이루어진다.
먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다.

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

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

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

철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.
출력
첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.
내 풀이
import sys
input = sys.stdin.readline
board = []
for _ in range(5):
board.append(list(map(int, input().split())))
announcement = []
for _ in range(5):
announcement.append(list(map(int, input().split())))
announcement = [col for row in announcement for col in row]
def find_index(matrix, value):
for i, row in enumerate(matrix):
if value in row:
return (i, row.index(value))
for index, v in enumerate(announcement):
bingo_count = 0
idx = find_index(board, v)
board[idx[0]][idx[1]] = True
# row-wise
for i in range(5):
if board[i] == [True, True, True, True, True]:
bingo_count += 1
if bingo_count >= 3:
print(index+1)
break
# column-wise
for i in range(5):
cnt = 0
for j in range(5):
if board[j][i] == True:
cnt += 1
if cnt == 5:
bingo_count += 1
if bingo_count >= 3:
print(index+1)
break
# diagonal-1
cnt = 0
for i in range(5):
if board[i][i] == True:
cnt += 1
if cnt == 5:
bingo_count += 1
if bingo_count >= 3:
print(index+1)
break
#diagonal-2
cnt = 0
for i in range(5):
if board[i][4-i] == True:
cnt += 1
if cnt == 5:
bingo_count += 1
if bingo_count >= 3:
print(index+1)
break
코멘트
우선 빙고 게임을 진행하기 위해 사회자가 부른 숫자를 True로 변환하여 빙고가 만들어지는지 체크하도록 했다. 빙고는 가로 줄, 세로 줄, 대각선의 경우가 있으므로 이 줄에서 True가 5개 있으면 빙고 1줄로 인식하도록 했다.
처음에는 bingo 함수를 따로 만들어서 한꺼번에 빙고가 성립하는지를 확인했는데, 그렇게 하면 후반부에 숫자 하나를 부름으로써 한꺼번에 몇 개의 빙고 줄이 완성되었을 때를 대처할 수가 없어서 함수를 따로 만들지 않고 가로 줄을 체크하고 난 뒤에 3개의 선이 있는지, 세로 줄을 체크하고 난 뒤에 3개의 선이 있는지, 대각선을 체크하고 난 뒤에 3개의 선이 있는지를 단계별로 계속 체크하는 방식으로 바꾸었다. 생각보다 로직 짜기가 까다로웠다.