[문제]
[풀이방법]
쉽게 생각하면 가로 / 세로 나누어서 길이가 3이 되는 부분의 카운트를 가져오는 연산으로 해결할 수 있고, 저처럼 처음에 DFS에서 허덕이고 있다면 문제 푸는 시간이 길어질 수 있습니다.
DFS로 할 경우 Depth가 3일 때 빠져나오는 건 좋지만 3이 되는 기준 지점을 찾기가 애매한 문제가 있었습니다.
시작 지점을 정확히 정해야 하기 때문에 가로길이와 세로길이를 따로 반복문을 돌리면서 '0' 을 만나거나 칸의 끝에 다다르면 카운트를 늘려줬습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
static int[] dx = {0,1,0,-1};
static int[] dy = {1,0,-1,0};
static int[][] map;
static boolean[][] visited;
static int N, K;
static int ans = 0;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
StringBuffer sf = new StringBuffer();
for (int k=0; k < T; k++) {
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken()); //단어의 길이
map = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken()); //1은 흰색 / 0은 검은색
}
}
ans = 0;
/**
* 가로 세로 길이가 K이면 단어가 들어갈 수 있다.
*/
//가로 길이 세어보기
for (int i = 0; i < N; i++) {
int j = 0;
int count = 0;
while(true) {
if (map[i][j] != 1) { //0을 만났을 때 길이가 3으로 떨어지면 이전까지 칸이 길이가 3이라는뜻
if (count == K) ans++;
count = 0;
j++;
}
else { //1일 경우
count++;
j++;
}
if (j == N) { //끝에 다다랐을 때 -> while문을 나가야 함
if (count == K) ans++;
break;
}
}
}
//세로 길이 세어보기
for (int i = 0; i < N; i++) {
int j = 0;
int count = 0;
while(true) {
if (map[j][i] != 1) { //0을 만났을 때 길이가 3으로 떨어지면 이전까지 칸이 길이가 3이라는뜻
if (count == K) ans++;
count = 0;
j++;
}
else { //1일 경우
count++;
j++;
}
if (j == N) { //끝에 다다랐을 때 -> while문을 나가야 함
if (count == K) ans++;
break;
}
}
}
}
System.out.println(sf.toString());
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'SWEA > D2' 카테고리의 다른 글
[SWEA 1974][D2][JAVA] 스도쿠 검증 (0) | 2019.05.03 |
---|---|
[SWEA 1970][D2][JAVA] 쉬운 거스름돈 (0) | 2019.05.03 |
[SWEA 1976][D2][JAVA] 시각덧셈 (0) | 2019.05.02 |
[SWEA 1984][D2][JAVA] 중간 평균값 매기기 (0) | 2019.05.01 |
[SWEA 1983][D2][JAVA] 조교의 성적 매기기 (0) | 2019.05.01 |