[Python] 빙고 게임

신지·2022년 6월 3일

Python

목록 보기
1/1

문제

빙고(Bingo) 게임은 아래 그림의 예에서와 같이 5x5 바둑판 모양의 카드에 1 에서 75 사이의 숫자가 각 작은 사각형에 적혀져 있는데, 같은 숫자가 한 번 이상 적혀져 있지는 않으며, 가장 중심에 있는 사각형에는 항상 0 이 적혀져 있다.

빙고게임에는 숫자 1 에서 75 사이의 숫자를, 중복 없이, 임의로 뽑아서 그 번호를 외치는 사람이 있는데, 빙고게임에 참여한 사람들은 그 사람이 부르는 번호가 자기 카드에 있을 경우에는 그 번호가 적혀진 사각형에 표시를 한다. 가장 중앙에 0
이 적혀져 있는 사각형은 항상 표시가 되어 있다. 이 빙고 게임에서 이기는 사람은 번호가 하나씩 차례로 외쳐질 때, 다음과 같은 조건을 가장 먼저 만족하는 카드를 가지고 있는 사람이다.

  • 같은 행(row) 에 있는 다섯 개의 사각형이 모두 표시된 경우
  • 같은 열(column) 에 있는 다섯 개의 사각형이 모두 표시된 경우
  • 두 개의 대각선 중에서 하나의 대각선에 있는 다섯 개의 사각형이 모두 표시된 경우
  • 네 개의 모서리에 있는 사각형이 모두 표시된 경우

위의 네 개의 조건을 가장 먼저 만족하는 경우가 몇 번째 번호가 뽑혀졌을 경우인지를 계산하는 프로그램을 작성하시오.

Code

test_c = int(input())

for test in range(test_c) :

    bingo = [input().split() for _ in range(5)] 
    bingo[2][2] = int(0)

    cnt = 0
    number = list(map(int, input().split()))
    a = False

    for n in number :
        for p in range(5):
            for q in range(5):
                if bingo[p][q] == str(n):
                    bingo[p][q] = 0

        cnt += 1

        if bingo[0][0] == 0 and bingo[1][1] == 0 and bingo[3][3] == 0 and bingo[4][4] == 0 :
            print(cnt)
            a = True
        elif bingo[0][4] == 0 and bingo[1][3] == 0 and bingo[3][1] == 0 and bingo[4][0] == 0 :
            print(cnt)  
            a = True
        elif bingo[0][4] == 0 and bingo[4][0] == 0 and bingo[0][0] == 0 and bingo[4][4] == 0 :
            print(cnt)
            a = True
        else :
            if bingo.count([0, 0, 0, 0, 0]) >= 1 :
                print(cnt)
                a = True
            else :
                for i in range(5):
                        if bingo[0][i] == bingo[1][i] == bingo[2][i] == bingo[3][i] == bingo[4][i] :
                            print(cnt)
                            a = True
            
        if a == True :
            break


코드 설명

bingo = [input().split() for _ in range(5)] 
    bingo[2][2] = int(0)

빙고 판에 들어올 숫자를 이중 리스트로 받는다. 이때 str로 받았기 때문에 가운데 0은 정수로 변환해 준다.

for p in range(5):
            for q in range(5):
                if bingo[p][q] == str(n):
                    bingo[p][q] = 0
                    
cnt += 1

이중 for문을 통해 number 리스트에 들어온 값을 한 개씩 비교하며 빙고판 내에 같은 숫자가 있다면 0으로 바꿔준다. 이때, 빙고판을 string으로 받았기 때문에 비교하는 숫자도 str으로 비교해 준다. 진짜 당연한 얘기인데 이거 실수한 거 발견 못해서 2시간을 날렸디...

if bingo[0][0] == 0 and bingo[1][1] == 0 and bingo[3][3] == 0 and bingo[4][4] == 0 :
 	print(cnt)
            a = True
elif bingo[0][4] == 0 and bingo[1][3] == 0 and bingo[3][1] == 0 and bingo[4][0] == 0 :
	print(cnt)  
	a = True
elif bingo[0][4] == 0 and bingo[4][0] == 0 and bingo[0][0] == 0 and bingo[4][4] == 0 :
	print(cnt)
	a = True
else :
	if bingo.count([0, 0, 0, 0, 0]) >= 1 :
		print(cnt)
		a = True
	else :
		for i in range(5):
			if bingo[0][i] == bingo[1][i] == bingo[2][i] == bingo[3][i] == bingo[4][i] :
				print(cnt)
				a = True

대각선, 꼭지점을 bingo[ ][ ] == 0으로 비교해주고, 가로는 count로, 세로는 행은 고정해두고 열만 변수로 둬서 비교했다. 빙고가 완성되면 더 이상의 카운트가 없도록 break를 걸어줘 for문을 끝내기 위해 조건을 만족할 경우 a = True를 사용했다.

리뷰

사실 if문의 향연이라 어디 내놓기 창피한 코드지만... 정리해두지 않으면 까먹을 것 같아서 시험 공부 겸 정리해봤다. 더 좋은 방법이 있을 것 같지만 다른 사람들 코드 공개되면 연구해 봐야겠다. 사실 그렇게 어려운 문제는 아니었던 것 같은데 지레 겁먹어서 말도 안 되는 실수를 정말 많이 했다. int랑 str이랑 비교하기, bingo[ ] [ ] == 0 하나 빼먹기 등... 정신 차려라 제발 그래도 친구가 코드에 고민한 흔적 많이 보인다고 칭찬도 해 줬고, 사실 이렇게 오래 걸릴 문제는 아니었지만 간만에 한 문제 오래 풀어서 기분이 좋았다. 내가 봐도 내 코드가 엉망진창이기 때문에 시간이 난다면 꼭 더 효율적인 코드로 다시 리뷰 해야겠다. -- 국민대알고랩

0개의 댓글