문제
https://www.acmicpc.net/problem/2578
2578번: 빙고
첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로
www.acmicpc.net
구현력을 요구하는 문제 였습니다.
메인 단에서, 3차원 반복문으로 끊기 위해 엠씨가 부르는 숫자를 저장하는 리스트를 일차원 리스트로 구현하였습니다.
이 후, 빙고 여부를 체크하기 위해 엠씨가 부르는 숫자와, 빙고판의 숫자가 같은 경우 빙고판의 원소를 0으로 초기화 해주고, 초기화 횟수를 세어주었습니다.
초기화 횟수가 12 이상이면, 빙고판의 0으로 체크해준 작업에 대해 빙고가 이뤄진지는 모르지만, 최소한의 빙고가 이뤄질 수 있는 경우이므로 check_bingo() 함수를 통해 빙고 여부를 체크해줍니다.
문제 조건과 같이 가로,세로,왼쪽 대각선, 오른쪽 대각선의 모든 요소가 같은 경우가 3개 이상인 경우 빙고를 외치므로, 이에 맞게 정답이 출력되도록 구현해주었습니다.
Python
#빙고판
nums = [list(map(int, input().split())) for i in range(5)]
#사회자 입력 -> 일차원 리스트로 입력받게 함. (3차원 반복문으로 끊기 위해)
mc = []
for i in range(5):
mc += list(map(int, input().split()))
def check_bingo():
bingo = 0
#가로 확인
for num in nums:
if num.count(0) == 5:
bingo+=1
# 세로 확인
for i in range(5):
y = 0
for j in range(5):
if nums[j][i] == 0:
y+=1
if y == 5:
bingo+=1
# 왼 - 대각선
left_d = 0
for i in range(5):
if nums[i][i] == 0:
left_d +=1
if left_d == 5:
bingo+=1
# 오 - 대각선
right_d = 0
for i in range(5):
if nums[i][4-i] == 0:
right_d +=1
if right_d == 5:
bingo+=1
return bingo
count = 0
for i in range(25):
for x in range(5):
for y in range(5):
if mc[i] == nums[x][y]:
nums[x][y] = 0
count+=1
if count >=12: #적어도 빙고가 이뤄질 수 있는 최소한의 경우, 아직 빙고가 이뤄진지는 알 수 없음
if check_bingo() >= 3: #빙고의 개수가 3 이상이면
print(i+1) #빙고판은 0번부터 돌기 때문에 +1
break'백준' 카테고리의 다른 글
| [백준] 1758 알바생 강호 - Python (1) | 2023.05.24 |
|---|---|
| [백준] 1343 폴리오미노 - Python (0) | 2023.05.24 |
| [백준] 1654 랜선 자르기 - Python (0) | 2023.03.02 |
| [백준] 12891 DNA 비밀번호 - Python (0) | 2023.02.28 |
| [백준] 14425 문자열 집합 - Python (0) | 2022.12.22 |