CodingTest

SWEA - 어디에 단어가 들어갈 수 있을까(1979)

취업하고싶다! 2023. 10. 21. 19:49
 

SW Expert Academy

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

swexpertacademy.com

 

문제

N X N 크기의 단어 퍼즐을 만들려고 한다. 입력으로 단어 퍼즐의 모양이 주어진다.

주어진 퍼즐 모양에서 특정 길이 K를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램을 작성하라.

[예제]

N = 5, K = 3 이고, 퍼즐의 모양이 아래 그림과 같이 주어졌을 때


길이가 3 인 단어가 들어갈 수 있는 자리는 2 곳(가로 1번, 가로 4번)이 된다.
 


[제약 사항]
1. N은 5 이상 15 이하의 정수이다. (5 ≤ N ≤ 15)
2. K는 2 이상 N 이하의 정수이다. (2 ≤ K ≤ N)

 

 

접근방식

0과 1로 이뤄진 NxN 배열이 주어지면 연속된 행과 열에서 1의 값이 K의 길이만큼 있는 것들의 개수를 세는 문제

행과 열로 나눠서 값을 구하고 더해주는 문제

먼저 N만큼 for문을 2번 돌면서 arr[k][x]가 1이면 cnt 변수에 1을 더해줌

그리고 arr[k][x]가 0이거나 x == N-1(마지막 인수)이면 먼저 cnt와 K가 같은지 체크

같으면 result += 1을 해줌. 그리고 arr[k][x] == 0이면 cnt = 0으로 초기화

같은 작업을 열에도 적용

 

if arr[k][x] == 0 or x == N-1:
    if cnt == K:
    	result += 1
    if arr[k][x] == 0:
    	cnt = 0

이부분에서 cnt == K를 arr[k][x] == 0보다 먼저 해주는 이유:

예로 arr[1][0]~ arr[1][4] 가 [1, 1, 1, 0, 0]일 경우 앞선 조건문에 의해 cnt = 3이 되어있을 것임

여기서 arr[1][3] == 0 or 3 == N-1 이 조건문 중 arr[1][3] == 0에 의해 위 조건문에 해당되므로 if문을 돌텐데

만약 arr[k][x] == 0 조건문이 cnt == K 조건문보다 위에 있으면 arr[1][3] == 0이므로 cnt = 0이 됨

그 후 cnt == K 조건문에서 0 == 3이므로 result += 1라는 수식을 할 수가 없음

 

 

코드

T = int(input())
for i in range(1, T+1):
    N, K = map(int, input().split())
    arr = [list(map(int, input().split())) for _ in range(N)]
    
    result = 0
    for k in range(N):
        cnt = 0
        for x in range(N):
            if arr[k][x] == 1:
                cnt += 1
            if arr[k][x] == 0 or x == N-1:
                if cnt == K:
                    result += 1
                if arr[k][x] == 0:
                    cnt = 0
    
    for a in range(N):
        cnt = 0
        for b in range(N):
            if arr[b][a] == 1:
                cnt += 1
            if arr[b][a] == 0 or b == N-1:
                if cnt == K:
                    result += 1
                if arr[b][a] == 0:
                    cnt = 0
    print('#'+str(i), result)