문제
N X N 크기의 단어 퍼즐을 만들려고 한다. 입력으로 단어 퍼즐의 모양이 주어진다.
주어진 퍼즐 모양에서 특정 길이 K를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램을 작성하라.
입력
입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스의 첫 번째 줄에는 단어 퍼즐의 가로, 세로 길이 N 과, 단어의 길이 K 가 주어진다.
테스트 케이스의 두 번째 줄부터 퍼즐의 모양이 2차원 정보로 주어진다.
퍼즐의 각 셀 중, 흰색 부분은 1, 검은색 부분은 0 으로 주어진다.
10 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 … |
출력
테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
#1 2 #2 6 #3 6 #4 0 #5 14 #6 2 #7 45 #8 0 #9 98 #10 7 |
코드
1. 가로 세로 따로 계산하는 경우
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
|
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt(); //테스트 케이스 개수
for(int i=0; i<t; i++){
int n = sc.nextInt(); //가로x세로 길이
int k = sc.nextInt(); //단어의 길이
int answer = 0; //총 개수
int[][] arr = new int[n][n]; //배열
//배열 받아오기
for(int x=0; x<n; x++){
for(int y=0; y<n; y++){
arr[x][y] = sc.nextInt();
}
}
//가로 cnt
for(int x=0; x<n; x++){
int cnt = 0;
for(int y=0; y<n; y++){
if(arr[x][y] == 1){ //빈칸일 경우
cnt++; //cnt 값 추가
if (y+1==n||arr[x][y+1]==0){ //끝나거나 다음 값이 0인 경우
if(cnt==k) answer++; //길이가 같으면 값 추가
cnt = 0; //cnt 초기화
}
}
}
}
//세로 cnt
for(int x=0; x<n; x++){
int cnt = 0;
for(int y=0; y<n; y++){
if(arr[y][x] == 1){ //빈칸일 경우
cnt++; //cnt 값 추가
if (y+1==n||arr[y+1][x]==0){ //끝나거나 다음 값이 0인 경우
if(cnt==k) answer++; //길이가 같으면 값 추가
cnt=0; //cnt 초기화
}
}
}
}
System.out.printf("#%d %d\n",i+1,answer);
}
}
}
|
cs |
2. 가로 세로 한 번에 계산하는 경우
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
|
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt(); //테스트 케이스 개수
for(int i=0; i<t; i++){
int n = sc.nextInt(); //가로x세로 길이
int k = sc.nextInt(); //단어의 길이
int answer = 0; //총 개수
int[][] arr = new int[n][n]; //배열
//배열 받아오기
for(int x=0; x<n; x++){
for(int y=0; y<n; y++){
arr[x][y] = sc.nextInt();
}
}
//가로, 세로에서 단어 개수 세기
for(int x=0; x<n; x++){
int cntRow = 0;
int cntCol = 0;
for(int y=0; y<n; y++){
//가로 방향 계산
if(arr[x][y] == 1) {
cntRow++;
}
else{
if(cntRow==k) answer++; //길이가 같으면 값 추가
cntRow = 0;
}
//세로 방향 체크
if(arr[y][x] == 1) cntCol++;
else{
if(cntCol==k) answer++; //길이가 같으면 값 추가
cntCol = 0;
}
}
//마지막 값도 체크
if(cntRow==k) answer++;
if(cntCol==k) answer++;
}
System.out.printf("#%d %d\n",i+1,answer);
}
}
}
|
cs |
'SW expert Academy > D2' 카테고리의 다른 글
[SW Expert Academy] 1974번 스도쿠 검증 (0) | 2023.05.11 |
---|---|
[SW Expert Academy] 1976번 시각 덧셈 (0) | 2023.05.11 |
[SW Expert Academy] 1983번 조교의 성적 매기기 (0) | 2023.04.21 |
[SW Expert Academy] 1984번 중간 평균값 구하기 (0) | 2023.04.21 |
[SW Expert Academy] 1986번 지그재그 숫자 (0) | 2023.04.20 |