시작이 반

[백준] 2578번번 (python 파이썬) 본문

알고리즘/백준

[백준] 2578번번 (python 파이썬)

G_Gi 2021. 3. 25. 17:14
SMALL

https://www.acmicpc.net/problem/2578

구현 문제이다.

 

사회자가 숫자를 부르면서 빙고판을 색칠해 가는데 

빙고가 3개가 나오면 사회자가 몇번째에 빙고가 나왔는지 출력하는 문제이다.

 

visited 리스트를 만들어서 사용하였다.

2차원배열의 전체에 해당하는 list

row만 확인하는 list

col만 확인하는 list

대각선을 확인하는 list

 

list를 채우는 방식

만약 2차원 visited에서 0행이 빙고가 완성되면

row[0] 을 True로 바꿔준다.

열과 대각선도 마찬가지이다. 대신 대각선은 0, 1 로 이루어져있다.

 

True의 개수를 3개 이상일때까지 row list, col list, 대각선 list를 확인한다. 

 

bingo = [list(map(int, input().split(' '))) for _ in range(5)]
targets = list()
for _ in range(5):
    targets.extend(list(map(int, input().split())))

visitied = [[False] * 5 for _ in range(5)]
row_visited = [False] * 5
col_visited = [False] * 5
x_visited = [False] * 2  # 0: 오른쪽위, 1:오른쪽 아래


def ismake_bingo():
    for i in range(5):  # row
        if all(visitied[i]):
            row_visited[i] = True

    for i in range(5):  # col
        temp = list()
        for j in range(5):
            temp.append(visitied[j][i])

        if all(temp):
            col_visited[i] = True

    temp_up = list()
    temp_down = list()
    for i in range(5):
        temp_up.append(visitied[i][i])  # 오른쪽 아래 대각선
        temp_down.append(visitied[i][4 - i])  # 오른쪽 위 대각선
    if all(temp_down):
        x_visited[0] = True
    if all(temp_up):
        x_visited[1] = True


def count_bingo():
    count = 0

    for i in range(5):
        if row_visited[i]:
            count += 1
        if col_visited[i]:
            count += 1
    for i in range(2):
        if x_visited[i]:
            count += 1

    return count


for j in range(len(targets)):
    x = None
    for i in range(5):
        if targets[j] in bingo[i]:
            x = i
            break
    y = bingo[x].index(targets[j])

    visitied[x][y] = True
    ismake_bingo()
    if count_bingo() >= 3:
        print(j + 1)
        break
LIST