[BOJ_Python] 2578번 빙고 (실버 4)

황준성·2024년 10월 23일
0

BOJ_Python

목록 보기
1/70

문제 2578


입력 예시

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
        

chat GPT가 고쳐준 코드

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

* 주요 변경 사항

  1. 입력 처리 수정: called_numbers를 25개의 숫자로 직접 입력받도록 변경했다

  2. 빙고 확인 최적화: 리스트 컴프리헨션을 사용하여 코드를 더 간결하게 만들었다.
    리스트 컴프리헨션을 통해 대부분의 빙고 확인 반복문을 바꿀 수 있었다. 리스트 컴프리헨션도 공부를 해야겠다.

  3. 가독성 개선: 전체적으로 코드의 가독성을 높였다.

오류가 생겼던 부분

called_numbers

오류가 생겼던 코드

# 빙고판 입력 받기
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
        

컨프리헨션을 적용한 코드

profile
Make progress

0개의 댓글