여니의 취준 준비/코딩테스트 (Python)

[Python] n2578번 | 빙고

여니's 2021. 5. 3. 21:26


bingo_map = [list(map(int, input().split())) for _ in range(5)]
master_map = [list(map(int, input().split())) for _ in range(5)]
visited = [[0 for _ in range(5)] for _ in range(5)]
master_cnt = 0

def cnt_check(bingo_num):
    if bingo_num >= 3:
        return False

 

입력값 받아오는 과정

 bingo_map = 빙고판 배열

master_map = 사회자가 부르는 배열 순서대로 받아오기

visited= 방문처리하는 배열

master_cnt = answer

 

cnt_check 함수는

현재 클리어된 줄의 개수가 3이상일 경우 False를 반환하는 함수


 

 

def is_check(visited):
    bingo_num = 0
    # 가로
    for x in range(5):
        row = True
        if False in visited[x]:  # 0=False
            row = False
        if row:
            bingo_num += 1

    # 세로
    col_check=list(map(list,zip(*visited))) #병렬처리 해주는 함수 > zip()함수
    for x in range(5):
        column=True
        if False in col_check[x]:
            column=False
        if column:
            bingo_num+=1

    # 대각선 (상->하. 하->상)
    diagonal1, diagonal2 = True, True
    for x in range(5):
        if visited[x][x] == 0:
            diagonal1 = False
        if visited[x][4 - x] == False:
            diagonal2 = False

    if diagonal1:
        bingo_num += 1
    if diagonal2:
        bingo_num += 1


    if bingo_num >= 3:
        return True
    return False

가로,세로, 대각선 체크하는 함수

# 가로

True, False를 잘 사용해야 한다는 걸 이번 문제를 풀며 깨달았다..

이런 문제 풀 땐, 노트에 헷갈리지 않게 과정을 대략 적고 시작하자..

(제발~!)

만약 행에 False가 하나라도 있으면 row값엔 False가 들어가고

세로 빙고 확인하러 넘어간다.


# 세로

zip()함수의 용이함을 이번에 알게 되었다.

0 1 2

3 4 5

6 7 8

이라는 배열이 있다.

zip() 내장함수를 이용하면

행과 열의 순서를 바꿔줄 수 있다!

 

0 3 6

1 4 7

2 5 8

 

물론 zip 함수를 사용하지 않고 구현할 수도 있다.

    for x in range(5):
        column=True
        if False in visited[:][x]:
            column=False
        if column:
            bingo_num+=1

 

# 대각선

처음엔 대각선이 가장 까다로웠는데,

풀다 보니까 아니었다 ㅎ..ㅎ

# 대각선 (상->하. 하->상)
    diagonal1, diagonal2 = True, True
    for x in range(5):
        if visited[x][x] == 0:
            diagonal1 = False
        if visited[x][4 - x] == False:
            diagonal2 = False

    if diagonal1:
        bingo_num += 1
    if diagonal2:
        bingo_num += 1


    if bingo_num >= 3:
        return True
    return False

 

여기서도 True, False를 기준으로 한다.

 

 

final = True
for i in range(5):
    for j in range(5):
        ex_bool = True
        for x in range(5):
            for y in range(5):
                if bingo_map[x][y] == master_map[i][j]:
                    bingo_map[x][y] = 0
                    visited[x][y] = True
                    master_cnt += 1
                    ex_bool = False
                    break
            if ex_bool != True:
                break

        if is_check(visited):
            print(master_cnt)
            final = False
            break

    if final != True:
        break

위는 단순 반복문이다!

사회자가 부르는 숫자대로 빙고판에 체크하는 과정!

빙고판에는 숫자를 0으로 바꿔주고,

visited 배열에는 True를 넣어준다.

(참고로 0은 False에 해당된다.)

 

 

 


2022. 02. 21 

다시 푼 코드

bingo = []
bingo_dic = {}  # 빙고 숫자 위치 저장 딕셔너리
for i in range(5):
    li = list(map(int, input().split()))
    bingo.append(li)
    for j in range(5):
        bingo_dic[li[j]] = (i, j)  # *****

moderator = [list(map(int, input().split())) for _ in range(5)]
visited = [[0 for _ in range(5)] for _ in range(5)]
answer = 0


def check():
    global answer
    answer=0
    # 가로 줄, 세로 줄 확인
    for i in range(5):
        row, col = 0, 0
        for j in range(5):
            if visited[i][j]:
                row += 1
            if visited[j][i]:
                col += 1
        if row == 5:
            answer += 1
        if col == 5:
            answer += 1
    # 왼쪽 대각선
    left, right = 0, 0
    for i in range(5):
        if visited[i][i]:
            left += 1
        if visited[i][4 - i]:
            right += 1
    if left == 5:
        answer += 1
    if right == 5:
        answer += 1


result = 0
for i in range(5):
    for j in range(5):
        nx, ny = bingo_dic[moderator[i][j]]
        visited[nx][ny] = 1
        result += 1
        check()
        if answer >= 3:
            print(result)
            exit()

 

answer=0으로 초기화를 

함수 실행시마다 해줘야하는데

그걸 까먹어서

좀 애를 먹었다.

 

 

 

 

 

 

 

 

 

 

 


문제 출처

:www.acmicpc.net/problem/2578

 

2578번: 빙고

첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로

www.acmicpc.net

 

코드 참고 

: velog.io/@woga1999/BOJ-2578%EB%B2%88-%EB%B9%99%EA%B3%A0-Python

 

BOJ - 2578번 빙고 (Python)

문제 출처: https://www.acmicpc.net/problem/2578Silver 5문제 그대로 구현. 파이썬 초보에게는 문법 때문에 내가 모르는게 있나하고 일일이 검색해봄

velog.io