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
#BOJ 문제2578
def bingo(arr):
bingo_number = 0
# 가로가 빙고일 때
for i in arr:
if i.count(0) == 5:
bingo_number += 1
# 세로가 빙고일때
for i in range(5):
zero_count = 0
for j in range(5):
if arr[j][i] == 0:
zero_count += 1
if zero_count == 5:
bingo_number += 1
# 대각선 1일 빙고일때
zero_count = 0
for i in range(5):
if arr[i][i] == 0:
zero_count += 1
if zero_count == 5:
bingo_number += 1
# 대각선2가 빙고일때
zero_count = 0
for i in range(5):
if arr[i][4-i] == 0:
zero_count += 1
if zero_count == 5:
bingo_number += 1
return bingo_number
# 빙고판 입력 받기
game_map = []
for i in range(5):
game_map.append(list(map(int, input().split())))
called_numbers = []
for _ in range(5):
called_numbers.extend(map(int, input().split()))
# 3줄 빙고가 되려면 최소 12개는 되어야 함. 그걸 카운트하기 위한 변수
# 그리고 이 변수를 통해 몇번째 호출에서 빙고가 되었는지도 알 수 있음
count = 0
for value in called_numbers:
for i in range(5):
for j in range(5):
if game_map[i][j] == value:
game_map[i][j] = 0
# 값이 일치할때마다 값을 0으로 바꾸고 카운트
count += 1
# 세 줄 빙고의 최솟값인 12개 이상부터는 bingo함수를 통해 빙고인지 확인함
if count >= 12:
if bingo(game_map) >= 3:
print(count)
break
def bingo(arr):
bingo_number = 0
# 가로 검사
for row in arr:
if row.count(0) == 5:
bingo_number += 1
# 세로 검사
for col in range(5):
if all(arr[row][col] == 0 for row in range(5)):
bingo_number += 1
# 첫 번째 대각선 검사
if all(arr[i][i] == 0 for i in range(5)):
bingo_number += 1
# 두 번째 대각선 검사
if all(arr[i][4 - i] == 0 for i in range(5)):
bingo_number += 1
return bingo_number
# 빙고판 입력 받기
game_map = [list(map(int, input().split())) for _ in range(5)]
called_numbers = []
for _ in range(5):
called_numbers.extend(map(int, input().split()))
# 호출된 숫자 카운트
count = 0
# 숫자 처리
for number in called_numbers:
for i in range(5):
for j in range(5):
if game_map[i][j] == number:
game_map[i][j] = 0 # 호출된 숫자를 0으로 표시
count += 1
# 빙고 확인
if count >= 12 and bingo(game_map) >= 3:
print(count)
break
* 주요 변경 사항
입력 처리 수정: called_numbers를 25개의 숫자로 직접 입력받도록 변경했다
빙고 확인 최적화: 리스트 컴프리헨션을 사용하여 코드를 더 간결하게 만들었다.
리스트 컴프리헨션을 통해 대부분의 빙고 확인 반복문을 바꿀 수 있었다. 리스트 컴프리헨션도 공부를 해야겠다.
가독성 개선: 전체적으로 코드의 가독성을 높였다.
오류가 생겼던 코드
# 빙고판 입력 받기
game_map = []
for i in range(5):
game_map.append(list(map(int, input().split())))
order = []
for i in range(5):
order.append(list(map(int, input().split())))
count = 0
for value in called_numbers:
for i in range(5):
for j in range(5):
if game_map[i][j] == value:
game_map[i][j] = 0
# 값이 일치할때마다 값을 0으로 바꾸고 카운트
count += 1
# 세 줄 빙고의 최솟값인 12개 이상부터는 bingo함수를 통해 빙고인지 확인함
if count >= 12 and bingo(game_map) >= 3:
print(count)
break
game_map을 받은 이후에 사회자가 부른 숫자를 입력받는데 원래는 append함수와 list함수를 이용해서 2차원 리스트로 입력을 받았다. 하지만 굳이 2차원리스트로 만들 필요 없이 1차원 리스트로 받아도 된다.
called_numbers = []
for _ in range(5):
called_numbers.extend(map(int, input().split()))
이렇게 5번씩 끊어서 입력받으면 1차원 리스트로 받을 수 있다. 1차원 리스트로 받는 다른 이유는 마지막 반복문에서 오류가 날 수 있기 때문이다
for value in called_numbers:
for i in range(5):
for j in range(5):
if game_map[i][j] == value:
game_map[i][j] = 0
# 값이 일치할때마다 값을 0으로 바꾸고 카운트
count += 1
2차원 리스트면 반복문으로 값을 하나씩 뺄때 오류가 생길 수 있다고 한다.
2차원 리스트를 쓰고 싶으면 반복문을 하나 더 추가해서 called_numbers[t] 같은 방식으로 1차원 리스트를 지정해서 값을 뺄 수도 있지만 1차원리스트로 받는게 훨씬 가독성이 높아 보인다.
#BOJ 문제2578
def bingo(arr):
bingo_number = 0
# 가로가 빙고일 때
for i in arr:
if i.count(0) == 5:
bingo_number += 1
# 세로 빙고 컨프리헨션
for i in range(5):
if all(arr[j][i] == 0 for j in range(5)):
bingo_number += 1
# 대각선 컨프리헨션
if all(arr[i][i] == 0 for i in range(5)):
bingo_number += 1
# 대각선 2 컨프리헨션
if all(arr[i][4-i] == 0 for i in range(5)):
bingo_number += 1
return bingo_number
# 빙고판 입력 받기
game_map = []
for i in range(5):
game_map.append(list(map(int, input().split())))
called_numbers = []
for _ in range(5):
called_numbers.extend(map(int, input().split()))
# 3줄 빙고가 되려면 최소 12개는 되어야 함. 그걸 카운트하기 위한 변수
# 그리고 이 변수를 통해 몇번째 호출에서 빙고가 되었는지도 알 수 있음
count = 0
for value in called_numbers:
for i in range(5):
for j in range(5):
if game_map[i][j] == value:
game_map[i][j] = 0
# 값이 일치할때마다 값을 0으로 바꾸고 카운트
count += 1
# 세 줄 빙고의 최솟값인 12개 이상부터는 bingo함수를 통해 빙고인지 확인함
if count >= 12:
if bingo(game_map) >= 3:
print(count)
break
컨프리헨션을 적용한 코드