2578 - 빙고

2025. 11. 21. 13:44·알고리즘 공부/백준 사이트 문제
728x90

 

 

시간 제한메모리 제한제출정답맞힌 사람정답 비율

1 초 128 MB 28964 13522 10846 46.466 %

문제

 

빙고 게임은 다음과 같은 방식으로 이루어진다.

먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다

다음은 사회자가 부르는 수를 차례로 지워나간다. 예를 들어 5, 10, 7이 불렸다면 이 세 수를 지운 뒤 빙고판의 모습은 다음과 같다.

차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.

이러한 선이 세 개 이상 그어지는 순간 "빙고"라고 외치는데, 가장 먼저 외치는 사람이 게임의 승자가 된다.

철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.

입력

첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.

출력

첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.

테스트 케이스

 

입력

11 12 2 24 10
16 1 13 3 25
6 20 5 21 17
19 4 8 14 9
22 15 7 23 18
5 10 7 16 2
4 22 8 17 13
3 18 1 6 25
12 19 23 14 21
11 24 9 20 15

출력

15
from collections import defaultdict, deque

number_locations = defaultdict(tuple)
for r in range(5): # 행 (0~4)
    line = list(map(int, input().split()))
    for c in range(5): # 열 (0~4)
        number_locations[line[c]] = (r, c)

# 불렀는지 확인
check_board = [[False] * 5 for _ in range(5)]

row_sum = [0] * 5    # 각 행(0~4)에 체크된 칸의 개수
col_sum = [0] * 5    # 각 열(0~4)에 체크된 칸의 개수
diag_sum = [0] * 2   # [0]: 왼쪽 위 -> 오른쪽 아래 대각선, [1]: 오른쪽 위 -> 왼쪽 아래 대각선

# 사회자가 부른 번호들을 리스트에 넣기
call_num = deque()
for _ in range(5):
    line_numbers = list(map(int, input().split()))
    call_num.extend(line_numbers)

bingo_count = 0
# 부른 숫자를 하나씩 꺼내서 불렀는지 확인
for i in range(1, 26):
    # 숫자 꺼내기
    called_number = call_num.popleft()
    # 위치 찾기
    r, c = number_locations[called_number]
    # 체크 로직
    # 만약 중복되었다면
    if check_board[r][c] == True:
        continue
    # 만약 체크되지 않았다면 체크 해주기
    if check_board[r][c] == False:
        check_board[r][c] = True
    
    # 행 합계 및 빙고 확인
    row_sum[r] += 1
    if row_sum[r] == 5:
        bingo_count += 1
    
    # 열 합계 및 빙고 확인
    col_sum[c] += 1
    if col_sum[c] == 5:
        bingo_count += 1

    # \ 대각선 빙고 확인
    if r == c:
        diag_sum[0] += 1
        if diag_sum[0] == 5:
            bingo_count += 1
    
    # / 대각선 빙고 확인
    if r + c == 4:
        diag_sum[1] += 1
        if diag_sum[1] == 5:
            bingo_count += 1

    # 종료 조건 확인
    if bingo_count >= 3:
        print(i)
        break
728x90
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 공부 > 백준 사이트 문제' 카테고리의 다른 글

2566 - 최댓값  (0) 2025.11.21
2615 - 오목  (0) 2025.11.21
13275 - 가장 긴 팰린드롬 부분 문자열  (0) 2025.10.31
6566 - 애너그램 그룹  (0) 2025.10.31
20920 - 영단어 암기는 괴로워  (0) 2025.10.31
'알고리즘 공부/백준 사이트 문제' 카테고리의 다른 글
  • 2566 - 최댓값
  • 2615 - 오목
  • 13275 - 가장 긴 팰린드롬 부분 문자열
  • 6566 - 애너그램 그룹
같은편
같은편
책을 통해 이때까지 블로그나 유튜브에서 얻었던 지식의 파편들을 정립하고 합쳐 단단한 발판으로 만들기 위한 블로그
  • 같은편
    홍익대 게임소프트웨어전공의 프로그래밍 단련 공간
    같은편
  • 전체
    오늘
    어제
    • 분류 전체보기 (101)
      • 게임 프로그래밍 패턴 (2)
      • C# 프로그래밍 (26)
      • C++ 프로그래밍 (32)
        • 함수 (8)
        • 클래스 (22)
      • 알고리즘 공부 (29)
        • 백준 사이트 문제 (14)
        • codingame 사이트 문제 (11)
      • 유니티엔진 - 게임 공부 (3)
      • 언리얼엔진 - 게임 공부 (4)
      • 쓸모 있을 수 있는 팁 (2)
      • 일상이야기 (3)
  • 링크

    • 깃허브
  • 인기 글

  • 태그

    예외 처리
    언리얼
    복사 생성자
    C#
    비동기
    람다식
    c++
    알고리즘
    언리얼엔진4
    탐욕 알고리즘
    클래스
    객체
    함수
    queue
    문제 풀이
    최단 경로
    언리얼엔진
    DFS
    task
    스레드
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
같은편
2578 - 빙고
상단으로

티스토리툴바