반응형
🕵️♂️ 문제 탐색
문제 설명:
사회자가 부르는 숫자에 따라 빙고판의 숫자를 지우면서, 빙고(한 줄이 모두 지워진 경우)가 3줄 이상 완성되었을 때 사회자가 몇 번째 숫자를 부른 후 빙고가 완성되는지 구하는 문제이다.
시간복잡도 분석:
- 숫자 탐색 및 갱신:
- 각 숫자를 탐색하고 해당 위치를 지우는 데는 O(1) (해시맵 활용).
- 따라서, 총 25개의 숫자를 갱신하는 데 O(25) = O(1).
- 빙고 체크:
- 빙고를 매번 확인하는 데 O(5+5+2)=O(12) (5개의 행, 5개의 열, 2개의 대각선 빙고 체크).
- 숫자 25개를 부를 동안 매번 확인하므로 최종 복잡도는 O(25×12)=O(300). 결국, O(1)
결론적으로, 입력 크기가 작아 O(300)으로 끝날 수 있다.
적합한 알고리즘:
- 빙고판 초기화:
- 빙고판의 숫자와 위치를 관리하기 위해 해시맵을 생성
- 사회자 숫자 처리:
- 숫자를 부를 때마다 해당 숫자를 빙고판에서 제거
- 빙고 체크:
- 행, 열, 대각선에서 5개의 숫자가 모두 제거되었는지 확인
- 빙고 완성 시점 출력:
- 빙고가 3줄 이상 완성되는 첫 번째 순간의 숫자 순서를 출력
🛠️ 코드 설계
1️⃣ 입력 처리 및 초기화
- 빙고판의 숫자와 위치를 해시맵으로 저장
- 사회자가 부르는 숫자 리스트를 저장
2️⃣ 숫자 처리 및 빙고 체크
- 숫자를 부를 때마다 해시맵에서 해당 위치를 찾고 체크 배열을 갱신
- 각 행, 열, 대각선을 확인하여 빙고의 개수를 계산
3️⃣ 결과 출력
- 빙고가 3줄 이상 완성된 순간의 순서를 출력
💻 정답 코드
def bingo():
board = [list(map(int, input().split())) for _ in range(5)] # 빙고판 입력
numbers = [int(x) for _ in range(5) for x in input().split()] # 부르는 숫자 입력
position = {board[i][j]: (i, j) for i in range(5) for j in range(5)}
row_check = [0] * 5
col_check = [0] * 5
diag_check = [0] * 2 # 대각선 체크
for count, number in enumerate(numbers, start=1):
if number not in position:
continue # 숫자가 빙고판에 없으면 무시
x, y = position[number] # 숫자의 위치 찾기
row_check[x] += 1
col_check[y] += 1
if x == y: # 왼쪽 위에서 오른쪽 아래 대각선
diag_check[0] += 1
if x + y == 4: # 오른쪽 위에서 왼쪽 아래 대각선
diag_check[1] += 1
bingo_count = row_check.count(5) + col_check.count(5) + diag_check.count(5)
if bingo_count >= 3: # 빙고가 3줄 이상 완성되면 종료
print(count)
return
bingo()
반응형
'Programming > 코딩테스트 연습' 카테고리의 다른 글
백준 2775번 부녀회장이 될테야 Python 풀이 (2) | 2025.01.15 |
---|---|
백준 2748번 피보나치 수 2 Python 풀이 (2) | 2025.01.14 |
백준 7568번 덩치 Python 풀이 (1) | 2025.01.12 |
백준 2947번 나무 조각 Python 풀이 (1) | 2025.01.11 |
백준 25305번 커트라인 Python 풀이 (1) | 2025.01.10 |