백준
백준 2578 빙고 (파이썬)
MC류짱
2022. 8. 23. 22:29
https://www.acmicpc.net/problem/2578
2578번: 빙고
첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로
www.acmicpc.net
풀이
bingo = [list(map(int, input().split())) for _ in range(5)]
nums = list(map(int, input().split()))
for _ in range(4):
nums += list(map(int, input().split()))
dr = [1, 1]
dc = [1, -1]
def func():
count = 0
for num in nums:
for i in range(5):
for j in range(5):
bingo_sum = 0
if num == bingo[i][j]:
bingo[i][j] = 0
count += 1
for k in range(5):
r_num = 0
for l in range(5):
if bingo[k][l] != 0:
break
else:
if bingo[k][l] == 0:
r_num += 1
if r_num == 5:
bingo_sum += 1
if bingo_sum == 3:
return count
for l in range(5):
c_num = 0
for k in range(5):
if bingo[k][l] != 0:
break
else:
if bingo[k][l] == 0:
c_num += 1
if c_num == 5:
bingo_sum += 1
if bingo_sum == 3:
return count
r = c = 0
if bingo[r][c] == 0:
cross1 = 0
for k in range(5):
nr, nc = r + dr[0]*k, c + dc[0]*k
if bingo[nr][nc] == 0:
cross1 += 1
if cross1 == 5:
bingo_sum += 1
if bingo_sum == 3:
return count
r, c = 0, 4
if bingo[r][c] == 0:
cross2 = 0
for k in range(5):
nr, nc = r + dr[1]*k, c + dc[1]*k
if bingo[nr][nc] == 0:
cross2 += 1
if cross2 == 5:
bingo_sum += 1
if bingo_sum == 3:
return count
print(func())
해석 및 후기
어렵게 풀었다.. 이렇게 코드 길게 쳐본 것 오랜만이다..
일단 사회자가 말하면 count를 1씩 더해준다.
그리고 해당 빙고 칸을 0으로 바꾸고
행 탐색, 열 탐색, 교차 2번 탐색하고, 매번 탐색할 때마다 bingo_num이 3인지 확인한다.
쉽게 풀어볼 방법을 생각해봐야겠다.