연속 길이 세거나 할 때 자꾸 미래를 보지 말 것. K+1 그냥 세고자 하는 값과 다른 게 나와서 streak이 끊어지면, 예를 들어 1110001010 → 1의 연속된 길이를 찾는다면 현재 값이 1일 때 누적 값 체크하지 말고 0이 나오면 체크할 것
정답
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
# ///////////////////////////////////////////////////////////////////////////////////
ans = 0
void = 0
num, goal = map(int, input().split()) # n은 배열 크기, k는 목표 단어 길이
arr = [list(map(int, input().split())) for _ in range(num)]
# 전치행렬 사용한 풀이
arr_t = list(zip(*arr))
for i in range (2):
for j in range (num):
void = 0
for k in range (num): # k + 1 방식은 성공한 적이 없다, 현 상태를 보고 판단
# 답 힌트!!!!!!!: 현재 칸이 1이면 void 올리고, 0일 때 void 접근해서 goal인지 판단 후 리셋
# 1일 때 void 상태 체크하면 현재 값이 3이라는 것 외에 뒤에 더 뭐가 오는지 몰라
# 그래서 백만장자 문제도 뒤에서 읽은 것
# 미래로 가서 0이 나왔을 때 void 체크
# void = 0
if i == 0: # 원래 행렬
if arr[j][k] == 1:
void += 1
if k == num-1: # 열 끝에 다다랐는데 k가 1이면 그냥 넘어가니까
if void == goal:
ans += 1
else: # 첫 0 나올 때 지금까지 나온 연속 1의 길이 체크
if void == goal:
ans += 1
void = 0
else: # 전치 행렬
if arr_t[j][k] == 1:
void += 1
if k == num-1: # 열 끝에 다다르면
if void == goal:
ans += 1
else:
if void == goal:
ans += 1
void = 0
print (f'#{test_case} {ans}')하현석님 답
T = int(input())
for tc in range(1, T + 1):
N, K = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(N)]
result = 0
for i in range(N): #가로로 한줄씩 본다
point = 0
while point < N:
if grid[i][point] == 1: #빈칸을 만나면 전체 길이를 센다
length = 1
while point + 1 < N and grid[i][point + 1] == 1:
length += 1
point += 1
if K == length: #목표 길이와 일치한다면 하나 가산
result += 1
point += 1
else:
point += 1
for i in range(N): #세로로 한줄씩 본다
point = 0
while point < N:
if grid[point][i] == 1: #빈칸을 만나면 전체 길이를 센다
length = 1
while point + 1 < N and grid[point + 1][i] == 1:
length += 1
point += 1
if K == length: #목표 길이와 일치한다면 하나 가산
result += 1
point += 1
else:
point += 1
print(f'#{tc} {result}')