[백준 / 2578 / Python] 빙고

2025. 6. 14. 21:04·Algorithm/백준
반응형

문제 요약

5×5 빙고판에 1~25까지의 수가 한 번씩 적혀 있습니다.
사회자가 25개의 수를 한 번씩 부를 때,
각 수가 불릴 때마다 빙고판에서 해당 수를 지웁니다.
가로, 세로, 대각선 중 5개가 모두 지워진 줄이 3개 이상이 되는 순간
철수는 "빙고!"를 외치게 됩니다.
사회자가 몇 번째 수를 부른 후 빙고가 완성되는지 구하는 문제입니다.


접근 방식

  • 빙고판과 사회자가 부르는 수의 순서를 2차원 리스트로 입력받습니다.
  • 각 숫자가 불릴 때마다, 빙고판에서 해당 숫자를 찾아 체크합니다.
  • 매번 가로, 세로, 두 대각선에 대해
    5개가 모두 체크된 줄(빙고 줄)의 개수를 셉니다.
  • 빙고 줄이 3개 이상이 되는 순간,
    그때까지 부른 수의 개수를 출력하고 종료합니다.

실생활 비유로 설명하면,
"빙고판에 체크 표시를 하면서
가로, 세로, 대각선 줄이 3개 이상 완성되는 순간을
실시간으로 감시하는" 방식입니다.


코드 구현

아래는 Python으로 구현한 코드입니다.

import sys
input = sys.stdin.readline

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

checked = [[False] * 5 for _ in range(5)]

def count_bingo():
    bingo = 0

    # 가로
    for row in checked:
        if all(row):
            bingo += 1

    # 세로
    for col in range(5):
        if all(checked[row][col] for row in range(5)):
            bingo += 1

    # 대각선 1
    if all(checked[i][i] for i in range(5)):
        bingo += 1

    # 대각선 2
    if all(checked[i][4 - i] for i in range(5)):
        bingo += 1

    return bingo

# 사회자가 부르는 숫자 순서대로 1차원 리스트로 변환
flat_calls = [num for row in call for num in row]

for step, number in enumerate(flat_calls, start=1):
    # 숫자를 찾아서 체크
    for i in range(5):
        for j in range(5):
            if board[i][j] == number:
                checked[i][j] = True
                break

    if count_bingo() >= 3:
        print(step)
        break

시간복잡도 & 최적화

  • 시간복잡도:
    • 각 숫자마다 빙고판 전체(최대 25칸)에서 위치를 찾고 체크: O(1)
    • 빙고 줄 개수 세기: O(5) (가로, 세로, 대각선)
    • 전체적으로 O(25 × 5) = O(1) 수준
  • 최적화 포인트:
    • 빙고판이 작으므로, 매번 전체를 순회해도 충분히 빠름
    • 체크 여부를 별도의 2차원 리스트로 관리해 가독성 향상

느낀 점 / 팁

  • 빙고판처럼 크기가 작고,
    모든 경우를 직접 확인해도 되는 문제는
    단순 구현이 가장 효과적입니다.
  • 가로, 세로, 대각선 판별은
    각각 별도의 루프나 조건문으로 명확하게 구현하면
    실수 없이 코드를 작성할 수 있습니다.

참고

  • 백준 2578번 문제 링크
  • 빙고 게임 위키백과

반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm > 백준' 카테고리의 다른 글

[백준 / 11728 / Python] 배열 합치기 최적화: 시간복잡도 O(N log N)에서 O(N)으로 개선하기  (2) 2025.06.23
[백준 / 2239 / Python] 스도쿠  (0) 2025.06.13
[백준 / 17404 / Python] RGB거리 2  (2) 2025.06.13
[백준 / 2342 / Python] Dance Dance Revolution  (0) 2025.06.13
[백준 / 2143 / Python] 두 배열의 합  (0) 2025.06.13
'Algorithm/백준' 카테고리의 다른 글
  • [백준 / 11728 / Python] 배열 합치기 최적화: 시간복잡도 O(N log N)에서 O(N)으로 개선하기
  • [백준 / 2239 / Python] 스도쿠
  • [백준 / 17404 / Python] RGB거리 2
  • [백준 / 2342 / Python] Dance Dance Revolution
Kun Woo Kim
Kun Woo Kim
안녕하세요, 김건우입니다! 웹과 앱 개발에 열정적인 전문가로, React, TypeScript, Next.js, Node.js, Express, Flutter 등을 활용한 프로젝트를 다룹니다. 제 블로그에서는 개발 여정, 기술 분석, 실용적 코딩 팁을 공유합니다. 창의적인 솔루션을 실제로 적용하는 과정의 통찰도 나눌 예정이니, 궁금한 점이나 상담은 언제든 환영합니다.
  • Kun Woo Kim
    WhiteMouseDev
    김건우
  • 깃허브
    포트폴리오
    velog
  • 전체
    오늘
    어제
  • 공지사항

    • [인사말] 이제 티스토리에서도 만나요! WhiteMouse⋯
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 분류 전체보기 (100) N
      • Frontend Development (39) N
      • Backend Development (21) N
      • Algorithm (33) N
        • 백준 (11) N
        • 프로그래머스 (17)
        • 알고리즘 (5)
      • Infra (1)
      • 자료구조 (3)
  • 링크

    • Github
    • Portfolio
    • Velog
  • 인기 글

  • 태그

    tailwindcss
    frontend development
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kun Woo Kim
[백준 / 2578 / Python] 빙고
상단으로

티스토리툴바