article thumbnail image
Published 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인지 확인한다.

쉽게 풀어볼 방법을 생각해봐야겠다.

 

 

 

복사했습니다!