매우 쉽다. 호흡이 매우 긴 삼성 기출 풀다가 이거 푸니까 행복하다..
일단 2차원 배열 3개를 만든다.
이제 사회자가 부르는 수를 board에서 찾고, 찾은 위치에 대하여 bingo에 1을 기록해주면 된다. 이후 bingo 판에 대하여 가로줄, 세로줄, 대각선 빙고 개수를 구하고 3이상이면 종료한다.
전체 코드는 아래와 같다.
import sys
input = sys.stdin.readline
board = []
for _ in range(5):
board.append(list(map(int, input().strip().split())))
speak = []
for _ in range(5):
speak.append(list(map(int, input().strip().split())))
bingo = [[0] * 5 for _ in range(5)]
def check_row():
res = 0
for i in range(5):
cnt = 0
for j in range(5):
if bingo[i][j] == 1:
cnt += 1
if cnt == 5:
res += 1
return res
def check_col():
res = 0
for i in range(5):
cnt = 0
for j in range(5):
if bingo[j][i] == 1:
cnt += 1
if cnt == 5:
res += 1
return res
def check_dia():
res = 0
# 오->왼
cnt = 0
for i in range(5):
if bingo[i][5 - i - 1] == 1:
cnt += 1
if cnt == 5:
res += 1
# 왼->오
cnt = 0
for i in range(5):
if bingo[i][i] == 1:
cnt += 1
if cnt == 5:
res += 1
return res
cnt = 0
for i in range(5):
for j in range(5):
s = speak[i][j]
for y in range(5):
for x in range(5):
if board[y][x] == s:
cnt = 0
bingo[y][x] = 1
cnt += check_row() # 가로
cnt += check_col() # 세로
cnt += check_dia() # 대각선
if cnt >= 3:
print(
i * 5 + j + 1
) # 굳이 이렇게 안하고 사회자가 몇 번 부르는지 체크용 변수를 따로 만들어도 상관없을 것 같다.
exit() # 실제 코테에서는 exit 사용 x. 함수화 시켜서 return 하는 것을 권장
참고로 세로 줄 빙고를 확인할 때 아래와 같이 코드를 짤 수도 있다.
def check_col(visited): # 세로 빙고만 확인
cnt = 0
temp = list(map(list, zip(*visited)))[::-1]
for col in temp:
if sum(col) == 5:
cnt += 1
return cnt
zip 함수를 활용하면 굳이 인덱스 규칙을 찾을 필요 없이 바로 가로 빙고를 찾을 때처럼 동일하게 로직을 가져갈 수 있다.
물론 빙고 규칙은 워낙 간단해서 zip 함수를 쓰지 않아도 쉽지만, 더 복잡한 규칙을 요구하는 문제에서는 유용하게 쓰일 것 같다.
삼성 기출에서는 2차원 배열을 시계 방향으로 90도 회전할 때 zip함수가 자주 쓰인다.