백준 2578번 빙고 | python | 구현

Konseo·2023년 10월 6일
0

코테풀이

목록 보기
35/59

문제

링크

풀이

매우 쉽다. 호흡이 매우 긴 삼성 기출 풀다가 이거 푸니까 행복하다..
일단 2차원 배열 3개를 만든다.

  • speak
    • 사회자가 말하는 순서대로 값을 적어둔 2차원 배열
      • 생각해보니 굳이 이건 2차원 배열로 만들지 않아도 된다
  • board
    • 보드판 2차원 배열
  • bingo
    • 사회자가 부른 수에 따라 보드판에서 수를 지우는 행위를 기록해두는 2차원 배열
    • 0으로 초기화. visited 배열의 성격을 갖고 있음

이제 사회자가 부르는 수를 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함수가 자주 쓰인다.

profile
둔한 붓이 총명함을 이긴다

0개의 댓글