Baekjoon/IM Level

[백준] 2578 빙고 (실버4)

hellosonic 2023. 3. 9. 15:48

문제요약

나의 코드 및 설명

  • board : 빙고판
  • call_temp : 사회자가 부른 번호를 2차원 리스트에 임시 저장
  • call : 사회자가 부른 번호를 1차원 리스트에 저장
  • def bingo(board) : 빙고판이 몇 줄 지워졌는지 체크하는 메서드 생성. 가로 / 세로 / 대각선 두 가지 케이스, 총 4개의 케이스에 대해 몇 줄이 지워졌는지 카운트하여 저장한다. 이 때 cnt 값이 누적되지 않도록 꼭 bingo 메서드가 호출될 때 마다 cnt 값이 초기화 될 수 있도록 작성한다.
board = [] #빙고판
call_temp = [] #사회자가 부른 번호(임시)
for _ in range(5):
    board.append(list(map(int, input().split())))
for _ in range(5):
    call_temp.append(list(map(int, input().split())))

call = [] 

#사회자가 부른 번호 2차원 리스트를 1차원 리스트로 변환
for i in range(5):
    for j in range(5):
        call.append(call_temp[i][j])

#빙고판이 몇줄 지워졌는지 체크하는 메서드 작성
def bingo(board):
    global cnt
    cnt = 0 #메서드가 수행될때마다 카운트 값을 반드시 초기화
    for i in range(5):
        if board[i][0] == board[i][1] == board[i][2] == board[i][3] \
            == board[i][4] == 0:
            cnt += 1
        else:
            continue
    for j in range(5):
        if board[0][j] == board[1][j] == board[2][j] == board[3][j] \
            == board[4][j] == 0:
            cnt += 1
        else:
            continue
    if board[0][0] == board[1][1] == board[2][2] == board[3][3] \
        == board[4][4] == 0:
        cnt += 1
    if board[4][0] == board[3][1] == board[2][2] == board[1][3] \
        == board[0][4] == 0:
        cnt += 1   

#사회자가 부른 번호를 지우는 for문 작성
for k in range(len(call)-1):
    for i in range(5):
        for j in range(5):
            if board[i][j] == call[k]:
                board[i][j] = 0
    bingo(board) #사회자가 번호를 부를 때마다 몇 줄이 지워졌는지 카운트하는 메서드 동작
    if cnt >= 3: 
        print(k+1)
        break

다른 코드 및 설명

  • for _ in range(5): 
        mc += list(map(int, input().split()))
    => 2차원 리스트를 1차원 리스트로 변환시킬 때, 나는 고민 끝에 새로운 리스트를 선언하고, 그 안에 2차원 리스트의 값을 for문을 통해 저장하였다. 하지만, 리스트와 리스트를 <+> 연산 해주면 리스트의 요소가 추가된다는 점을 이용하여, 위 코드와 같이 작성하였다.
  • for i in range(5):
        y = 0
        for j in range(5):
            if c[j][i] == 0:
                y += 1
        if y == 5:
            bingo += 1
    => 세로의 값만 한 줄씩 확인하고 싶을 때 나는 일일이 확인하는 코드를 작성하였다. (2중 for문으로 작성할 방법을 생각하지 못했다.) 하지만 바깥의 for문을 작성 후 변수 y를 초기화하고, for문 안의 for문을 수행 시 if문을 만족한다면 y를 하나씩 증가시키고, y가 바깥에 수행했던 for문의 최대 범위와 같다면, bingo 값을 하나씩 더해주는 방법으로 작성이 가능하다.
import sys

c = [list(map(int, input().split())) for _ in range(5)]
mc = []

for _ in range(5):
    mc += list(map(int, input().split()))

print(mc)

def check():
    #가로 확인
    for x in c:
        if x.count(0) == 5:
            bingo += 1

    #세로 확인
    for i in range(5):
        y = 0
        for j in range(5):
            if c[j][i] == 0:
                y += 1
        if y == 5:
            bingo += 1

    #왼쪽 위부터 시작하는 대각선 확인
    d1 = 0
    for i in range(5):
        if c[i][i] == 0:
            d1 += 1
    if d1 == 5:
        bingo += 1

    #오른쪽 위부터 시작하는 대각선 확인
    d2 = 0
    for i in range(5):
        if c[i][4-i] == 0:
            d2 += 1
    if d2 == 5:
        bingo += 1
    
    return bingo #지워진 줄이 몇 줄인지 체크하고 리턴한다.

cnt = 0 
for i in range(25):
    for x in range(5):
        for y in range(5):
            if mc[i] == c[x][y]:
                c[x][y] = 0
                cnt += 1
    if cnt >= 12:
        result = check()
        
        if result >= 3:
            print(i + 1)
            break