[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]에 접근해줘야 한다. 범위 안에 있는지 체크하는 방법에는 두가지 방법이 있는데,

  1. if (i + x < 0   i + x >= N   j + y < 0   j + y >= N) continue;
  2. 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);
        }
    }
}

카테고리:

업데이트: