빙고(백준 2578번)
💡 **Check Point !
( 해당사항 ✓체크 )
막힘 없이 수월하게 풀린 문제인가? ✓
1시간이내로 풀렸던 문제인가?
1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
시간을 써도 도무지 풀 수 없는 문제인가?
솔루션을 찾아봤는가?
난이도 체감
최상
상
중
하✓
이해도
완벽히 이해✓
다소 헷갈리는 부분들이 있음
이해 못함
문제
빙고 게임은 다음과 같은 방식으로 이루어진다.
먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다
https://upload.acmicpc.net/5e2e03f0-5561-43c3-9b65-a752837732ef/-/preview/
다음은 사회자가 부르는 수를 차례로 지워나간다. 예를 들어 5, 10, 7이 불렸다면 이 세 수를 지운 뒤 빙고판의 모습은 다음과 같다.
https://upload.acmicpc.net/6fc024b4-5bf7-42de-b303-406db2e3ff5b/-/preview/
차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.
https://upload.acmicpc.net/b5ffac7e-7db4-4d54-bf2b-63ac7d6807d8/-/preview/
이러한 선이 세 개 이상 그어지는 순간 “빙고”라고 외치는데, 가장 먼저 외치는 사람이 게임의 승자가 된다.
https://upload.acmicpc.net/f86e3bcc-54da-420a-8f06-9600cb06eeaa/-/preview/
철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 “빙고”를 외치게 되는지를 출력하는 프로그램을 작성하시오.
나의 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
binggo=[list(map(int,input().split())) for _ in range(5)]
count=1
for _ in range(5):
anoun=list(map(int,input().split()))
bre_pro=0
for a in anoun:
bing=0
bre_for=0
for i in range(5):
for j in range(5):
if binggo[i][j]==a:
binggo[i][j]=-1
bre_for=1
break
if bre_for==1:
break
r_s=0
l_s=0
for k in range(5):
if sum(binggo[k])==-5:
bing+=1
column=0
for q in range(5):
column+=binggo[q][k]
if column==-5:
bing+=1
r_s+=binggo[k][k]
l_s+=binggo[k][4-k]
if r_s==-5:
bing+=1
if l_s==-5:
bing+=1
if bing>=3:
print(count)
bre_pro=1
break
count+=1
if bre_pro==1:
break
- 빙고판이 5x5밖에 되지 않기 때문에, 사회자가 숫자를 부를 때마다 빙고판을 확인하여 3개 이상의 줄이 만들어지는지 확인했다.
- 빙고가 나올 수 있는 경우는 ‘가로’, ‘세로’, ‘대각선’ 총 12개이다. 따라서 12개 경우를 모두 확인하여 연속해서 나오는 줄이 3개 이상일 경우 출력하도록 코드를 짰다.
주의)
1
2
3
4
5
for k in range(5):
if sum(binggo[k])==-5:
bing+=1
if sum(binggo[:][k])==-5:
bing+=1
- column의 수를 모두 더해서 확인하려고 했는데, 파이썬 list에서는 되지 않는다. 따라서 for문으로 처리해주어야 한다.