Study/Baekjoon

[Python] Baekjoon2578: 빙고, 오답이 될 수 있는 경우는?

devyoseph 2022. 1. 29. 22:33

빙고

1 초 128 MB 8628 3984 3361 46.590%

문제

빙고 게임은 다음과 같은 방식으로 이루어진다.

먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다

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

 

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

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

철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.

출력

첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.

풀이

빙고판의 숫자들을 배열 안에 집어넣고 사회자가 부르는 숫자들을 입력하며 빙고인지 아닌지 매번 체크합니다.

 

방법

여러가지 방법 중 크게 두 가지로 나눌 수 있습니다

1) 매번 빙고판 전체에서 빙고가 몇 개인지 판별

2) 새로 빙고를 체크한 곳을 기준으로 빙고 개수를 추가해 나감

 

주의점들

1) 숫자 하나를 놨는데 빙고가 한 번에 두 개가 추가되는 경우 ( 빙고가 3을 거치지 않고 4가 될 수 있음에 주의) 

2) 완전 정중앙 점에 놓을 때 → 한 번에 4개의 빙고가 생길 수 있습니다. 대각선(2), 가로, 세로

3) 빙고를 중복 탐색해서 개수를 여러번 세는 것을 주의합니다

bingo = []
for i in range(5):
    bingo.append(list(map(int,input().split())))

call = []
for i in range(5):
    call.extend(list(map(int,input().split())))

# 숫자를 넣으면 숫자 위치를 찾고 그 숫자를 기준으로 빙고가 만들어지는지 판별
def check(number):
    row = col = 0
    for i in range(5):
        for j in range(5):
            if number == bingo[i][j]:
                bingo[i][j] = 0
                row, col = i, j
                break
    garo = sero = 1
    for i in range(5):
        if bingo[row][i] != 0:
            sero = 0
            break
    for j in range(5):
        if bingo[j][col] != 0:
            garo = 0
            break
    daegack = 0
    if row == col:
        daegack += 1
        for i in range(5):
            if bingo[i][i] != 0:
                daegack -= 1
                break
    if row + col == 4:
        daegack += 1
        for i in range(5):
            if bingo[i][4-i] != 0:
                daegack -= 1
                break

    return garo+sero+daegack

count = 0
for i in range(25):
    if count >= 3: # 3을 건너뛰고 4개이상의 빙고가 생길 수 있음
        print(i)
        break
    # 새로 만들어지는 빙고수만큼 count에 추가
    count += check(call[i])