용꿀
꼬마개발자허니
용꿀
전체 방문자
오늘
어제
  • 분류 전체보기 (248)
    • 개발 (75)
      • 스프링 입문 (7)
      • 스프링 기본 (9)
      • ToDo List using JPA (2)
      • 스프링 개념 (9)
      • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (8)
      • 스프링 MVC (3)
      • CS (19)
      • 개발 팁 (8)
      • 스프링 MSA (5)
      • 곰터뷰🐻 (5)
    • 알고리즘 (169)
      • 알고리즘 문제 풀이 (165)
    • 잡동사니 (1)
      • 노래 가사 (1)
hELLO · Designed By 정상우.
용꿀

꼬마개발자허니

(Python) 백준 2578번 - 빙고
알고리즘/알고리즘 문제 풀이

(Python) 백준 2578번 - 빙고

2024. 10. 3. 14:23

문제 링크: https://www.acmicpc.net/problem/2578

 

풀이

단순 구현 문제로, 우리가 빙고 게임을 실제 하는 방법을 코드로 구현하면 되는 간단한 문제이다.

 

먼저 입력받은 숫자들을 board라는 배열에 담아, 빙고판을 완성한다. 다음으로 사회자가 부르는 수들을 called_nums라는 배열에 저장한다.

사회자가 수를 하나씩 부를 때마다 숫자를 board에서 지우고(-1로 변경), 현재 board의 상태에서 몇 개의 빙고가 존재하는지 카운트한다. 그리고 카운트한 값이 3 이상이면 그때의 수가 몇 번째로 부른 숫자인지 출력하면 된다.

 

주의해야 할 점은 반드시 3 이상인지 체크해야 한다는 것이다. 빙고의 수가 정확히 3인지 체크를 하다 보니, 하나의 수에 의해 빙고가 한 번에 2개 이상 완성되는 경우가 생겨 빙고의 총개수가 4가 되는 경우는 체크할 수 없었고, 이로 인해 올바른 결과를 출력하지 못하는 경우가 있었다.

import sys

board = [] # 빙고판
called_nums = [] # 사회자가 부를 수들
length = 5

for _ in range(length):
    row = list(map(int, sys.stdin.readline().split(" ")))
    board.append(row) # 빙고판에 숫자들 입력

for _ in range(length):
    numbers = list(map(int, sys.stdin.readline().split(" ")))
    called_nums.extend(numbers) # 사회자가 부를 수들을 입력

def mark_in_board(board, num):
    for i in range(length):
        for j in range(length): # 전체 보드를 순회하며
            if board[i][j] == num: # 사회자가 부른 수가 나타나면
                board[i][j] = -1 # 이를 -1로 표시

def is_bingo(arr):
    if len(set(arr)) == 1: # 배열 내의 모든 숫자가 -1인 경우
        return True # 빙고가 하나 완성된 경우
    return False


def check_row(board): # 전체 보드에서 몇 개의 행이 빙고인지 체크
    bingo = 0
    for i in range(length):
        if is_bingo(board[i]):
            bingo += 1

    return bingo


def check_col(board): # 전체 보드에서 몇 개의 열이 빙고인지 체크
    bingo = 0
    for j in range(length):
        values = []
        for i in range(length):
            values.append(board[i][j])

        if is_bingo(values):
            bingo += 1

    return bingo


def check_diagonal(board): # 전체 보드에서 몇 개의 대각선이 빙고인지 체크
    bingo = 0

    right_down = []
    right_up = []

    for i in range(length):
        right_up.append(board[i][length-i-1])
        right_down.append(board[i][i])

    if is_bingo(right_up):
        bingo += 1

    if is_bingo(right_down):
        bingo += 1

    return bingo


def check_bingos(board): # 가로, 세로, 대각선에서 빙고의 수를 세고, 이를 반환
    row = check_row(board)
    col = check_col(board)
    diagonal = check_diagonal(board)

    return row + col + diagonal


for idx, called_num in enumerate(called_nums, 1): # 사회자가 첫 번째로 부르는 숫자부터 시작하여 끝까지 순회 
    mark_in_board(board, called_num) # 빙고판에 부르는 숫자를 체크
    
    if check_bingos(board) >= 3: # 빙고의 수가 3 이상이면
        print(idx) # 사회자가 몇 번째로 부른 숫자인지 출력하고
        break # 반복 종료

 

'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글

(Python) 백준 14503번 - 로봇 청소기  (1) 2024.10.05
[프로그래머스 Lv.2] 할인 행사 (Python)  (3) 2024.10.03
[프로그래머스 Lv.2] 피로도 (Python)  (0) 2024.10.01
[프로그래머스 Lv.3] 길 찾기 게임 (Python)  (2) 2024.09.30
[프로그래머스 Lv.3] 순위 (Python)  (0) 2024.09.29
    '알고리즘/알고리즘 문제 풀이' 카테고리의 다른 글
    • (Python) 백준 14503번 - 로봇 청소기
    • [프로그래머스 Lv.2] 할인 행사 (Python)
    • [프로그래머스 Lv.2] 피로도 (Python)
    • [프로그래머스 Lv.3] 길 찾기 게임 (Python)
    용꿀
    용꿀

    티스토리툴바