본문 바로가기

코딩테스트/SWEA

[SWEA] 1979 : 어디에 단어가 들어갈 수 있을까 (파이썬)

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PuPq6AaQDFAUq&categoryId=AV5PuPq6AaQDFAUq&categoryType=CODE&problemTitle=%EC%96%B4%EB%94%94%EC%97%90&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


코드

def count(mtx):
    ans = 0
    for lst in mtx: # i(행) 인덱스 필요 없으므로
        cnt = 0
        for j in range(len(lst)):  # n+1 만큼(padding)
            if lst[j]: # 값이 있으면
                cnt += 1
            else: # 0일때만 확인하면 됨 (n 범위 밖인지 확인 불필요)
                if cnt == k:  # k값을 바꿀게 아니면 글로벌 선언 안하고 가져다 써도 됨
                    ans += 1
                cnt = 0 # 값 초기화 필수!!
    return ans


_ = int(input())
for t in range(1, 10 + 1):
    n, k = map(int, input().split())
    # 범위에서 벗어나는지 확인할 필요 없도록 배열 오른쪽, 아래 padding
    mtx = [list(map(int, input().split())) + [0] for _ in range(n)] + [[0] * (n+1)]
    #전치 행렬
    mtx_ = list(map(list, zip(*mtx)))
	
    res = count(mtx) + count(mtx_) 
    print(f'#{t} {res}')
  • 벽(0)을 만날 때 마다 지금까지의 1의 개수(cnt)반환 (cnt 초기화 필수) 
  • 벽은 행마다 존재하므로 for문에서 i(행)의 인덱스 대신 lst를 받아옴
  • 각 리스트의 열마다 값이 있는지 확인하고 
  • 벽(0)을 만나면 cnt와 단어수(n) 비교