문제
코드
코드는 다음과 같은 방식으로 구현했다.
일단 철수의 빙고판은 2차원 배열로 받고, 사회자가 부르는 숫자는 하나의 리스트로 받았다.
1. 사회자가 숫자를 하나씩 부르며 그 숫자와 일치하는 빙고판의 숫자는 0으로 변환함과 동시에 빙고인지 확인한다.
2. 일치하는 숫자의 위치를 기반으로 빙고를 체크한다. 가로와 세로는 항상 체크하며 일치하는 숫자의 위치가 대각선이라면 대각선 방향으로도 빙고를 확인한다.
3. 빙고가 3개 이상이라면 지금까지 부른 숫자의 갯수를 출력한다.
import sys
board = []
count = 0
bingo = 0
# Make bingo board (2D-metrix)
for i in range(5):
board.append(list(map(int, sys.stdin.readline().strip().split(" "))))
# Make mc num list (list)
mc = (list(map(int, sys.stdin.readline().strip().split(" "))))
for i in range(4):
mc += list(map(int, sys.stdin.readline().strip().split(" ")))
# Check total bingo
def count_bingo(i, j):
global bingo
bingo += check_diagonal(i, j) + check_row(i) + check_col(j)
return bingo
# Check current position is diagonal or not
def is_diagonal(i, j):
if i == j or i + j == 4:
return True
else:
return False
def check_diagonal(i, j):
if is_diagonal(i, j):
tmp = 0
if i == j:
for x in range(5):
if board[x][x]:
break
if x == 4:
tmp += 1
if i + j == 4:
for x in range(5):
if board[x][4-x]:
break
if x == 4:
tmp += 1
return tmp
else:
return 0
def check_row(i):
for j in range(5):
if board[i][j]:
return 0
return 1
def check_col(j):
for i in range(5):
if board[i][j]:
return 0
return 1
def main():
for count, number in enumerate(mc):
for i in range(5):
for j in range(5):
if number == board[i][j]:
board[i][j] = 0
if count_bingo(i, j) >= 3:
return count + 1
print(main())
결론
내가 작성한 코드의 경우 빙고판 전체를 훑는다. 빙고판을 Dict로 만들어서 사용하는 것이 더 빠르겠지만, 일단은 간단하게 구현하고자 했다. 그외에도 중간 중간 불필요한 연산이 있어 아쉬운 부분이 많지만 일단은 통과했으니까 다른 문제로...
'Study > Algorithm' 카테고리의 다른 글
[백준] 1655번 : 가운데를 말해요 (Python) (0) | 2021.12.06 |
---|---|
[프로그래머스] 가장 큰 수 (Python) (0) | 2021.12.05 |
[프로그래머스] 주식가격 (Python) (0) | 2021.12.02 |
[백준] 9663번 : N-Queen (Python) (0) | 2021.11.30 |
[백준] 5430번: AC (Python) (1) | 2021.11.29 |