[백준] 2578번 빙고 ★★

거북이·2023년 3월 23일
0

백준[실버4]

목록 보기
83/91
post-thumbnail

💡문제접근

  • 처음엔 4개의 함수를 별도로 만들어 우하향 대각선의 빙고 여부, 좌상향 대각선의 빙고 여부, 가로선의 빙고 여부, 세로선의 빙고 여부를 모두 체크해 빙고판의 라인의 개수가 3개 이상이 되는 시점일 때 값을 출력하는 방식으로 접근했지만 빙고 여부를 판별하는 함수의 작동에서 문제가 있었는지 제대로 해결되지 않았고 결국 여러 개의 함수를 작성하기보다는 하나의 함수 안에 4가지 기능을 구현하는 방식으로 코드를 바꿨고 꽤 오랜 시간동안 고민한 끝에 해결할 수 있었다.

💡코드(메모리 : 31256KB, 시간 : 40ms)

import sys
input = sys.stdin.readline

# 빙고판에서 그어진 라인의 개수가 3개 이상이 되는 시점에서 "빙고"를 외친다.
import sys
input = sys.stdin.readline

# 빙고판에서 그어진 라인의 개수가 3개 이상이 되는 시점에서 "빙고"를 외친다.
def isBingo(arr):
    bingo_line = 0
    
    # 가로줄의 빙고 여부 판별
    for i in arr:
        if i.count(1) == 5:
            bingo_line += 1

	# 세로줄의 빙고 여부 판별
    for i in range(5):
        temp_height = 0
        for j in range(5):
            if arr[j][i] == 1:
                temp_height += 1
        if temp_height == 5:
            bingo_line += 1
	
    # 우하향 대각선의 빙고 여부 판별
    temp_diagonal1 = 0
    for i in range(5):
        if arr[i][i] == 1:
            temp_diagonal1 += 1
    if temp_diagonal1 == 5:
        bingo_line += 1
	
    # 좌상향 대각선의 빙고 여부 판별
    temp_diagonal2 = 0
    for i in range(5):
        if arr[4-i][i] == 1:
            temp_diagonal2 += 1
    if temp_diagonal2 == 5:
        bingo_line += 1
    return bingo_line

# 5 * 5 사이즈의 2차원 배열 리스트를 선언해줌
bingo = [list(map(int, input().strip().split())) for _ in range(5)]

line1 = list(map(int, input().strip().split()))
line2 = list(map(int, input().strip().split()))
line3 = list(map(int, input().strip().split()))
line4 = list(map(int, input().strip().split()))
line5 = list(map(int, input().strip().split()))

# 사회자가 부르는 빙고판 숫자의 순서를 1차월 배열 리스트로 만들기 위해 선언
line = line1 + line2 + line3 + line4 + line5

for Turn, num in enumerate(line):
    for t in bingo:
        if num in t:
            t[t.index(num)] = 1
            break

    result = isBingo(bingo)
    if result >= 3:
        print(Turn+1)
        sys.exit(0)

💡소요시간 : 53m

0개의 댓글