(정답률 75.81%)
N X N 크기의 단어 퍼즐을 만들려고 한다. 입력으로 단어 퍼즐의 모양이 주어진다.
주어진 퍼즐 모양에서 특정 길이 K를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램을 작성하라.
5 3
0 0 1 1 1
1 1 1 1 0
0 0 1 0 0
0 1 1 1 1
1 1 1 0 1
5 3
1 0 0 1 0
1 1 0 1 1
1 0 1 1 1
0 1 1 0 1
0 1 1 1 0
#1 2
#2 6
import java.io.*;
import java.util.*;
class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
for (int i = 1; i <= T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int[][] arr = new int[n][n];
int rowCount = 0;
int columnCount = 0;
int answer = 0;
//우선 주어진 입력값으로 2차원 배열을 구성한다
for (int j = 0; j < n; j++) {
st = new StringTokenizer(br.readLine()," ");
for (int l = 0; l < n; l++) {
arr[j][l] = Integer.parseInt(st.nextToken());
}
}
//2차원 배열의 모든 원소를 확인해야 하므로 2중 for문을 구성
for (int j = 0; j < n; j++) {
for (int l = 0; l < n; l++) {
//우선 행을 기준으로 카운트한다
//각 행이 끝나기 전에 k번을 채우는 경우
//원소가 1일때 카운트하며
//0이면 카운트값을 0으로 초기화한다
//단 이미 카운트 값이 k이면 정답으로 카운트한다
if (arr[j][l] == 1) {
rowCount++;
} else if (arr[j][l] == 0) {
if (rowCount == k)
answer++;
rowCount = 0;
}
//행과 똑같이 열도 카운트를 수행
if (arr[l][j] == 1) {
columnCount++;
} else if (arr[l][j] == 0) {
if (columnCount == k)
answer++;
columnCount = 0;
}
}
//각 행과 열이 끝났을때 k번을 채우는 경우 정답으로 카운트
if (rowCount == k)
answer++;
if (columnCount == k)
answer++;
// 다음 반복을 위해 카운트값을 0으로 초기화
rowCount = 0;
columnCount = 0;
}
bw.write("#" + i + " " + answer + "\n");
bw.flush();
}
bw.close();
}
}
처음에는 어떻게 시작을 해야 하나 고민이 좀 있었는데
간단히 생각하니까 쉽게 풀렸다.
댓글을 보니까 전치행렬로 만들어 풀고 했다는데
수학을 그리 잘하지 못하다보니 그냥 직관적으로 푸는게 나한텐 맞는거 같다 ㅎㅎ..