https://www.acmicpc.net/problem/2578
문제
빙고 게임은 다음과 같은 방식으로 이루어진다.
먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다
철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.
출력
첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.
문제 탐색하기
5X5 빙고판이 있고, 3줄의 빙고가 완성이 되면 프로그램이 끝난다.
빙고는 같은 행, 같은 열, 대각선 2개로 한 줄이 완성이 된다.
대각선 1은 행과 열이 같은 숫자이면 된다. [0,0] [1,1] [2,2] [3,3] [4,4]
대각선 2는 행과 열의 합이 4이면 된다. [4,0] [3,1] [2,2] [1,3] [0,4]
코드 설계하기
우선 첫번째 줄 부터 다섯번째 줄까지는 bingo 배열에 저장 시킨다.
여섯번째 줄 부터는 사회자가 부르는 번호들이라서 따로 저장을 시키고, 하나의 숫자를 확인할때 마다 count++ 한
시도 회차 수정사항
코드를 설계하면서 계속 고민해도 답이 풀리지 않아서 검색해서 풀이를 보면서 이해하도록 노력했다.
코드
def check(tmp):
# 가로
for i in range(5):
if bingo[i] == [0] * 5:
tmp += 1
# 세로
for i in range(5):
if all(bingo[j][i] == 0 for j in range(5)):
tmp += 1
# 대각선1
if all(bingo[i][i] == 0 for i in range(5)):
tmp += 1
# 대각선2
if all(bingo[i][4 - i] == 0 for i in range(5)):
tmp += 1
return tmp
bingo = [list(map(int, input().split())) for _ in range(5)]
speak = []
for _ in range(5):
speak += list(map(int, input().split()))
cnt = 0
tmp = 0
for i in range(25):
for x in range(5):
for y in range(5):
if speak[i] == bingo[x][y]:
bingo[x][y] = 0
cnt += 1
if cnt >= 12:
result = check(tmp)
if result >= 3:
print(i + 1) # 배열은 0 부터 시작했으므로
break
'코테 공부 > BOJ' 카테고리의 다른 글
[백준] 1010번 - 다리 놓기 (파이썬) (0) | 2024.09.19 |
---|---|
[백준] 2775번 - 부녀회장이 될테야 (파이썬) (0) | 2024.09.18 |
[백준] 7568번 - 덩치 (파이썬) (0) | 2024.09.15 |
[백준] 2947번 - 나무 조각 (파이썬) (0) | 2024.09.14 |
[백준] 25305번 - 커트라인 (파이썬) (1) | 2024.09.13 |