반응형
문제 요약
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차원 리스트로 관리해 가독성 향상
느낀 점 / 팁
- 빙고판처럼 크기가 작고,
모든 경우를 직접 확인해도 되는 문제는
단순 구현이 가장 효과적입니다. - 가로, 세로, 대각선 판별은
각각 별도의 루프나 조건문으로 명확하게 구현하면
실수 없이 코드를 작성할 수 있습니다.
참고
반응형
'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 |