https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PzOCKAigDFAUq
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
[제약 사항]
1. N 은 5 이상 15 이하이다.
2. M은 2 이상 N 이하이다.
3. 각 영역의 파리 갯수는 30 이하 이다.
[입력]
가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 번째 줄에 N 과 M 이 주어지고,
다음 N 줄에 걸쳐 N x N 배열이 주어진다.
[출력]
출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
import java.util.Scanner;
public class Solution {
private static void fly(int max, int r, int c, int N, int M, int[][] arr, StringBuilder sb) {
int sum = 0;
if (r + M == N && c + M == N) {
sb.append(max+"\n");
return;
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < M; j++) {
sum += arr[r + i][c + j];
}
}
if (max <= sum)
max = sum;
if (c + M == N)
fly(max, r + 1, 0, N, M, arr, sb);
else fly(max, r,c+1,N,M,arr, sb);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int T = sc.nextInt();
int[][] arr;
int N, M;
for (int t = 0; t < T; t++) {
N = sc.nextInt();
M = sc.nextInt();
arr = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
arr[i][j] = sc.nextInt();
}
}
sb.append("#" + (t + 1) + " ");
fly(0, 0, 0, N, M, arr, sb);
}
System.out.print(sb);
}
}
현재 탐색중인 위치의 index와 max 값 등을 매개변수로 하는 재귀함수를 작성한 풀이법입니다.
현재 탐색중인 위치를 파리채의 좌상단 꼭짓점으로 간주하여 풀이하였습니다.
*fly(int max, int r, int c, int N, int M, int[][] arr, StringBuilder sb)
-매개변수
int max = 합계 최댓값
int r = 탐색 위치 row
int c = 탐색 위치 column
int N = 배열의 크기 (N*N)
int M = 파리채의 크기(M*M)
int[][] arr = N*N 배열
StringBuilder sb = 결과 String 제작용 StringBuilder
-종료조건
//탐색위치가 더이상 오른쪽이나 아래로 움직일 수 없을 때 (탐색끝)
r + M == N && c + M == N
//결과 String에 max 값과 개행문자 저장하고 return
sb.append(max+"\n");
return;
-동작
//현재 위치에서 파리채의 면적만큼 합계 계산
for (int i = 0; i < M; i++) {
for (int j = 0; j < M; j++) {
sum += arr[r + i][c + j];
}
}
//max 값보다 sum이 크거나 같다면 max를 sum값으로 갱신
if (max <= sum)
max = sum;
//column 탐색이 종료된 경우, [ r+1 ][ 0 ]로 재귀함수 호출
if (c + M == N)
fly(max, r + 1, 0, N, M, arr, sb);
//column 탐색이 종료되지 않은 경우, [ r ][ c+1 ]로 재귀함수 호출
else fly(max, r,c+1,N,M,arr, sb);
'문제해결 > SWExpertAcademy' 카테고리의 다른 글
SWExpertAcademy 1218번-괄호 짝짓기(JAVA) (0) | 2021.08.05 |
---|---|
SWExpertAcademy 1289번-원재의 메모리 복구하기(JAVA) (0) | 2021.08.05 |
SWExpertAcademy 2805번-농작물 수확하기(JAVA) (0) | 2021.08.04 |
SWExpertAcademy 1873번-상호의 배틀필드(JAVA) (0) | 2021.08.04 |
SWExpertAcademy 1210번-Ladder(JAVA) (0) | 2021.08.03 |