빙고(Bingo) 게임은 아래 그림의 예에서와 같이 5x5 바둑판 모양의 카드에 1 에서 75 사이의 숫자가 각 작은 사각형에 적혀져 있는데, 같은 숫자가 한 번 이상 적혀져 있지는 않으며, 가장 중심에 있는 사각형에는 항상 0 이 적혀져 있다.
빙고게임에는 숫자 1 에서 75 사이의 숫자를, 중복 없이, 임의로 뽑아서 그 번호를 외치는 사람이 있는데, 빙고게임에 참여한 사람들은 그 사람이 부르는 번호가 자기 카드에 있을 경우에는 그 번호가 적혀진 사각형에 표시를 한다. 가장 중앙에 0
이 적혀져 있는 사각형은 항상 표시가 되어 있다. 이 빙고 게임에서 이기는 사람은 번호가 하나씩 차례로 외쳐질 때, 다음과 같은 조건을 가장 먼저 만족하는 카드를 가지고 있는 사람이다.
위의 네 개의 조건을 가장 먼저 만족하는 경우가 몇 번째 번호가 뽑혀졌을 경우인지를 계산하는 프로그램을 작성하시오.
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 하나 빼먹기 등... 정신 차려라 제발 그래도 친구가 코드에 고민한 흔적 많이 보인다고 칭찬도 해 줬고, 사실 이렇게 오래 걸릴 문제는 아니었지만 간만에 한 문제 오래 풀어서 기분이 좋았다. 내가 봐도 내 코드가 엉망진창이기 때문에 시간이 난다면 꼭 더 효율적인 코드로 다시 리뷰 해야겠다. -- 국민대알고랩