문제
- 25개 칸으로 이루어진 빙고판에 1~25까지 자연수를 하나씩 쓴다.
- 사회자가 숫자를 하나씩 부를 때 먼저 세 줄 이상 만들면 승자가 된다.
- 철수의 빙고판이 주어질 때 몇 번째 수를 부른 후 "빙고"를 외치게 되는지 출력하기
풀이
- 1) 빙고판 숫자별로 위치를 기록한다 (loc)
빙고판도 따로 기록한다 (chulsoo)
- 2) MC의 숫자들을 입력한다 (MC)
- 3) 사회자가 부른 숫자들을 차례로 살펴보면서 해당 숫자 칸을 0으로 만들고, 완성된 줄이 있는지 확인한다.
- row 배열을 통해 각 행에 몇 개가 제거 됐는지 기록하고, 5가 되면 한 줄이 완성됐다고 볼 수 있다.
- col 배열을 통해 각 열에 몇 개가 제거 됐는지 기록하고, 5가 되면 한 줄이 완성됐다고 볼 수 있다.
- check 함수를 통해 왼쪽과 오른쪽 대각선이 모두 제거 됐는지 확인한다.
- 4) 3줄 이상 완성되면 몇 번째 숫자인지 출력한다.
def check(type) :
global cnt
n, op = 0, 1
if type == "right" :
n, op = 4, -1
for i in range(5) :
if chulsoo[i][n+op*i] :
return True
cnt += 1
return False
# 빙고판 숫자별 위치 입력
loc = dict()
chulsoo = []
for row in range(5) :
chulsoo.append(list(map(int, input().split())))
for col, num in enumerate(chulsoo[row]) :
loc[num] = (row, col)
# 사회자 숫자 입력
MC = []
for _ in range(5) :
MC.extend(list(map(int, input().split())))
# 빙고 카운팅
row = [0] * 5
col = [0] * 5
dig = [True, True]
cnt = 0
for i in range(25) :
# 사회자가 부른 숫자 찾기
r, c = loc[MC[i]]
row[r] += 1
col[c] += 1
chulsoo[r][c] = 0 # 해당 칸을 0으로 만들기
# 빙고 확인하기
if row[r] == 5 : # 행
cnt += 1
if col[c] == 5 : # 열
cnt += 1
if chulsoo[2][2] == 0 and dig[0] : # 왼쪽 대각선
dig[0] = check("left")
if chulsoo[2][2] == 0 and dig[1] : # 오른쪽 대각선
dig[1] = check("right")
# 빙고가 3줄 이상이면 출력
if cnt >= 3 :
print(i+1)
break
References