T = int(input())
for tc in range(1,T+1):
n,k = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(n)]
# print(arr)
"""
흰색이 1
"""
word_cnt = 0 # 가능한 단어 갯수 초기화
for i in range(n):
cnt = 0 # 개수 초기화
for j in range(n): # 가로 검사
if arr[i][j] == 1:
cnt += 1
# 검은색을 만났거나 or 벽에 닿았을 때
if arr[i][j] == 0 or j == n-1:
# 길이만큼 있으면?
if cnt == k:
word_cnt +=1
cnt = 0
# 세로검사
for j in range(n):
if arr[j][i] == 1:
cnt += 1
# 검은색을 만났거나 or 벽에 닿았을 때
if arr[j][i] == 0 or j == n-1:
# 길이만큼 있으면?
if cnt == k:
word_cnt +=1
cnt = 0
print(f'#{tc} {word_cnt}')
실수한 점
1. 해당 가로에 두개의 맞는 단어를 찾을 수 있음을 간과했음
# 검은색을 만났거나 or 벽에 닿았을 때
if arr[j][i] == 0 or j == n-1: # 길이만큼 있으면?
if cnt == k:
word_cnt +=1
cnt = 0
break # 해당 가로는 더 볼거 없다
2. 4방향 탐색 알고리즘을 채용한 것
T = int(input())
for tc in range(1,T+1):
n,k = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(n)]
# print(arr)
"""
0 으로 이루어진 길이가 딱 k 만큼 되야 된다.
k 보다 많아도 적어도 안된다.
2방향만 보면 된다.
"""
ok_cnt = 0 # 단어들어갈수 있는 객수
dij = [[0,1],[1,0]] # 오 아
for i in range(n):
for j in range(n):
len_ok = 0
for x in range(2):
for y in range(k): # 0 1 2
ni = i + dij[x][0] + y
nj = j + dij[x][1] + y
# 벽체크
if 0<= ni < n and 0<=nj< n and arr[ni][nj] != 0:
len_ok += 1
else:
break # 한 방향 탐색 멈추기
if len_ok == k:
ok_cnt += 1
# if arr[i][j] == 0 and arr[i+1][j] == 0 and arr[i+2][j] == 0:
# elif arr[i][j] == 0 and arr[i][j] == 0 and arr[i][j] == 0:
print(ok_cnt)
'알고리즘 문제풀이' 카테고리의 다른 글
백준 8958. OX 퀴즈 Python 브론즈2 (0) | 2024.02.18 |
---|---|
백준 2920. 음계 Python 브론즈2 (0) | 2024.02.18 |
백준 2669.직사각형 네개의 합집합의 면적 구하기 실버5 (0) | 2024.02.18 |
swea 2001. 파리 퇴치 Python (0) | 2024.02.17 |
백준 1284.집주소 Python 브론즈3 (0) | 2024.02.17 |