본문 바로가기

알고리즘 문제풀이

Swea D2_1979.어디에 단어가 있을까? Python

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)