[SWEA 2001] 파리 퇴치
업데이트:
문제
- SWEA 2001번
- 문제의 저작권은 SW Expert Academy에 있습니다.
접근방식
N x N배열의 0,0부터 돌면서 M x M영역 안에 있는 숫자를 모두 더해준다. 이때 검색 전, 행인덱스 i+x와 열인덱스 j+y의 범위가 N x N안에 있는지 항상 확인해 준 후에 map[i+x][j+y]에 접근해줘야 한다. 범위 안에 있는지 체크하는 방법에는 두가지 방법이 있는데,
-
if (i + x < 0 i + x >= N j + y < 0 j + y >= N) continue; - if (i + x >= 0 && i + x < N && j + y >= 0 && j + y < N) sum += map[i + x][j + y];
1번은 범위 안에 없는 경우를 확인하는 것이고 하나라도 무시하면 에러가 뜨므로 ||연산을 해준다.
2번은 범위 안에 있는 경우를 확인하는 것이고 조건을 모두 만족해야하기 때문에 &&연산을 해준다.
=> 이 차이를 잘 기억하자!
인덱스 하나당 M x M만큼 돈 후에는 max와 비교하여 최대값을 구해준다.
코드
package swea;
import java.util.Scanner;
public class Swea_2001 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int tc = 0; tc < T; tc++) {
int N = sc.nextInt();
int M = sc.nextInt();
int[][] map = new int[N][N];
int[][] kill = new int[M][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) map[i][j] = sc.nextInt();
}
// 탐색 시작
int max = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int sum = 0;
// kill만큼 돌아서 합 저장
for (int x = 0; x < M; x++) {
for (int y = 0; y < M; y++) {
//범위에 벗어나면
if (i + x < 0 || i + x >= N || j + y < 0 || j + y >= N) continue;
sum += map[i + x][j + y];
}
}
// 다 돈후, max 확인
if (sum > max) max = sum;
}
}
System.out.println("#"+(tc+1)+" "+max);
}
}
}