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으로 초기화를
함수 실행시마다 해줘야하는데
그걸 까먹어서
좀 애를 먹었다.
문제 출처
코드 참고
: velog.io/@woga1999/BOJ-2578%EB%B2%88-%EB%B9%99%EA%B3%A0-Python
'여니의 취준 준비 > 코딩테스트 (Python)' 카테고리의 다른 글
[n1244] 스위치 켜고 끄기 (0) | 2021.05.21 |
---|---|
[Python] n4396 | 지뢰찾기 (0) | 2021.05.05 |
[Python] n12933번 | 오리 (0) | 2021.05.03 |
[Python] n14467 | 소가 길을 건너간 이유 1 (0) | 2021.04.29 |
[Python] n1913 | 달팽이 (0) | 2021.04.29 |