새소식

반응형
Algotithms

[백준] 2578 빙고

  • -
728x90
반응형

문제

  • 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

  • 백준 구현
반응형

'Algotithms' 카테고리의 다른 글

[백준] 1277 발전소  (1) 2023.10.19
[백준] 7569 토마토  (0) 2023.10.19
[백준] 2073 수도배관공사  (1) 2023.10.17
[백준] 20300 서강근육맨  (1) 2023.10.17
[백준] 20546 🐜 기적의 매매법 🐜  (0) 2023.10.11
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.