문제
https://www.acmicpc.net/problem/2578
2578번: 빙고
첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로
www.acmicpc.net
알고리즘
1. 사회자가 불러주는 수의 값을 체크 할 수 있도록 빙고판과 같은 크기의 배열을 생성한다
2. 사회자가 값을 부를 때 마다 체크 한다
3. 체크 한 값이 12 이상일 때 마다 행과열의 합을 구해서 각 한 줄 씩 빙고가 성립한지 확인한다
4. 3줄이상 달성했을 경우 센 횟수 값을 출력하며 종료한다
코드
import sys
def Input_Data():
readl = sys.stdin.readline
map_bingo = [list(map(int, readl().split())) for _ in range(5)]
seq_bingo = [list(map(int, readl().split())) for _ in range(5)]
for _ in range(5):
seq_bingo += list(map(int,readl().split()))
return map_bingo, seq_bingo
#빙고 판에 체크하는 함수
def dis(cur):
for i in range(5):
for j in range(5):
if map_bingo[i][j] == cur:
return i,j
#빙고가 성립하는지 확인하는 함수
def check():
row_cnt=0
for i in range(5): #행의 합 구하기
if sum(visited[i]) == 5:
row_cnt+=1
if sum((list(map(list, zip(*visited))))[i]) == 5: #열의 합 구하기
row_cnt+=1
sum1,sum2 = 0,0
for i in range(5):
sum1 += visited[i][i]
sum2 += visited[i][4-i]
if sum1 == 5:
row_cnt+=1
if sum2 == 5:
row_cnt+=1
if row_cnt >=3: #빙고 성공
return True
else:
return False
def Solve():
cnt = 0
newlist = []
for i in range(5):
for j in range(5):
cur = seq_bingo[i][j] #사회자가 부르는 수의 값을 가져온다
x,y = dis(cur)#빙고판에 그 값을 체크한다
visited[x][y] = 1 #방문여부 체크
cnt+=1 #색칠한 칸 수 확인
if cnt>=12:#최소 12칸은 넘어야 빙고가 성립하므로
if check():#그것보다 클때 빙고 여부 확인
return cnt
sol = 0
visited = [[0]*(5) for _ in range(5)]
map_bingo, seq_bingo = Input_Data()
sol = Solve()
print(sol)
고찰
조건대로 구현만 하면 패스할 수 있는 문제였다
'Algorithm' 카테고리의 다른 글
[백준 1068] 트리 (0) | 2024.08.21 |
---|---|
[백준 10026] 적록색약 (2) | 2024.07.24 |
[백준 2583] 영역 구하기 (1) | 2024.02.04 |
[백준 6236] 용돈 관리 (0) | 2024.01.31 |
[백준 3055] 탈출 (1) | 2024.01.31 |