본문 바로가기
알고리즘

[BOJ / 2578 / Python] 빙고

by 치우치지않는 2023. 9. 20.

[ 문제 ]

https://www.acmicpc.net/problem/2578

[ 난이도 ]

실버4

[ 필요 개념 ]

없는 듯..?

[ 풀이 ]

처음엔, 태스크를 분리시키지 않고 진행했던 것 같다. 그런데 그랬더니 내가 생각지도 못한 부분에서 에러가 생겼고.. 구조를 최대한 단순하게 잡는 것이 무엇보다 중요함을 느꼈다. 이렇게 설계하면 예외적인 상황이 안 생기겠다! 는 느낌으로 짜야하는 것 같다. 예를 들어서 지금 풀이에서처럼 아예 마킹을 딱 끝내 놓고 가로줄, 세로줄, 대각선 검사를 한다든지..! 

배열의 인덱스는 0부터 시작한다는 점을 명심 또 명심..

파이썬으로 2차원 배열 만드는 법을 익혔다. 

[ 소스코드 ]

bingoCounter = 0

myList = [list(map(int, input().split())) for _ in range(5)]
answerList = [list(map(int, input().split())) for _ in range(5)]

for k in range(25):
  bingoCounter = 0
  newList = [(i, j) for i in range(5) for j in range(5)
             if myList[i][j] == answerList[k // 5][k % 5]]
  #마크업
  myList[newList[0][0]][newList[0][1]] = 0
  # print(myList)
  #가로줄 검사
  for i in range(5):
    rowSum = 0
    for j in range(5):
      rowSum += myList[i][j]
    if rowSum == 0:
      bingoCounter += 1

  # print('bingoCounter1...'+str(bingoCounter))
  #세로줄 검사
  for i in range(5):
    colSum = 0
    for j in range(5):
      colSum += myList[j][i]
      # print(colSum)
    if colSum == 0:
      bingoCounter += 1
  # print('bingoCounter2...'+str(bingoCounter))
  #대각선 검사
  xSum1 = 0
  xSum2 = 0
  for i in range(5):
    for j in range(5):
      if i == j:
        xSum1 += myList[i][j]
      if i + j == 4:
        xSum2 += myList[i][j]
  if xSum1 == 0:
    bingoCounter += 1
  if xSum2 == 0:
    bingoCounter += 1
  # print('bingoCounter3...'+str(bingoCounter))
  # print(k)
  # print(bingoCounter)
  #빙고 검사
  if bingoCounter > 2:
    print(k+1)
    break

댓글