링크
백준 2578 빙고
빙고가 완성된것을 어떻게 파악하는지가 중요하다.
처음엔 델타를 사용해 숫자를 불릴때마다 빙고인지 아닌지 검증하려 했는데 코드가 너무 길어지고 읽기싫게 생겼고 좀 너무.. 아닌것같아서 다른방법을 생각했다.
리스트를 하나 만들어서 리스트의 인덱스를 임의로 행과 열로 결정해 숫자가 불릴때마다 해당 행과 열에 맞는 인덱스에 1씩 추가해줬다.
그러다가 5가 되는 순간 빙고가 된 것으로 보고 빙고의 갯수를 추가해줬다.
처음엔 좌상단에서 시작하는 대각선만 고려하고 짜다가 에러가 났다.
생각해보니 우상단에서 시작하는 대각선도 있더라.. 해당 경우도 추가해주니 잘 돌아갔다.
bingo = []
for _ in range(5):
bingo.append(list(map(int, input().split())))
num = list(map(int, input().split()))
for _ in range(4):
num += list(map(int, input().split()))
check = [0] * 12 #바뀐것의 갯수 저장하는 리스트 idx0~4는 row / 5~9는 col / 10, 11은 대각
line = 0
flag = False
for n in range(25): #사회자가 하나씩 부른다.
if flag == True:
break
for i in range(5): #빙고탐색
if flag == True:
break
for j in range(5):
if flag == True:
break
if num[n] == bingo[i][j]: #사회자가 부른거 찾으면
bingo[i][j] = 0 #0 으로 바꾸고
check[i] += 1 #행 바뀐거 체크
check[j+5] += 1 #열 바뀐거 체크
if i == j: #대각
check[10] += 1
if i + j == 4: #반대대각
check[11] += 1
for c in range(12): #바뀐것 갯수 저장하는 리스트 탐색해서
if check[c] == 5: #5번 바뀌었으면
check[c] = 0 # 초기화시키고
line += 1 #빙고처리
if line == 3:
flag = True
break
print(n)