SWE 1979
- N*N 크기의 단어 퍼즐을 만들려고 한다.
-
주어진 퍼즐 모양에서 특정 길이 k를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램 작성
- 제약사항 N은 5이상 15이하 정수
- K는 2이상 N이하의 정수
- 첫 줄 총 테스트 케이스 개수
- 이후 첫 번째 줄에는 단어 퍼즐의 가로, 세로 길이 N, 단어의 길이 K가 주어짐
-
퍼즐의 각 셀 중, 흰색 부분은 1, 검은색 부분은 0으로 주어진다.
- DFS, BFS를 돌릴 것도 없이, for문을 통해 확인한다.
- 1을 만나면 값을 더해간다 -> 0을 만나면 check를 0으로 이를 다 한 뒤 그 값을 temp 배열에 저장
-
그 뒤, 단어의 길이와 일치하는 것의 개수를 찾는다.
- 3문제를 틀려서 확인해보니
- max로 if문을 걸어버리면[3,4]가 등장했을 때, 찾지 못해버린다.
- 단순히 temp 배열에서, 3이 나왔을 때, 그 오른쪽이 0이거나, 3이 배열의 마지막에 나왔을 때.
코드
TC = int(input())
for tc in range(1, TC+1):
N, K = map(int, input().split())
arr = []
for i in range(N):
arr.append(list(map(int, input().split())))
# 가로 길이 찾기
result = 0
for i in range(N):
temp = []
check = 0
for j in range(N):
if arr[i][j] == 1:
check += 1
else:
check = 0
temp.append(check)
if temp[-1] == K: # 가장 마지막에 있는 경우
result += 1
for k in range(N-1): # 마지막 제외 오른쪽에 0인 경우
if temp[k] == K and temp[k+1] == 0:
result += 1
# print("#%s" % i, temp, result)
# 세로 길이 찾기
for j in range(N):
temp = []
check = 0
for i in range(N):
if arr[i][j] == 1:
check += 1
else:
check = 0
temp.append(check)
if temp[-1] == K: # 가장 마지막에 있는 경우
result += 1
for k in range(N-1): # 마지막 제외 오른쪽에 0인 경우
if temp[k] == K and temp[k+1] == 0:
result += 1
# print("#%s" % i, temp, result)
print("#%d %d" % (tc, result))
# arr = [[1, 1, 0, 1, 0, 1, 1, 1],
# [0, 1, 0, 1, 0, 0, 0, 1],
# [1, 1, 1, 0, 0, 1, 0, 1],
# [0, 1, 0, 1, 0, 1, 1, 1],
# [0, 0, 0, 1, 0, 1, 0, 1],
# [1, 1, 1, 1, 1, 1, 0, 0],
# [0, 1, 0, 0, 0, 1, 0, 1],
# [1, 1, 1, 0, 1, 1, 1, 1]]
# N = 8
# K = 3
다른 사람 풀이
T = int(input())
for test_case in range(T):
N, K = map(int, input().split())
# 문자열로 행과 열을 입력 받는다.
data_row = [''.join(input().split()) for _ in range(N)]
data_col = [''.join(i) for i in zip(*data_row)]
total = data_row.copy()
total.extend(data_col)
ans = 0
for i in total:
result = i.split('0')
if '1' * K in result:
ans += result.count('1' * K)
print("#{} {}".format(test_case + 1, ans))
- 이렇게도 풀 수 있단 걸 배웠다.
참고자료 [SWexperacademy]https://swexpertacademy.com